在Java中创建十六进制字节数组

问题描述 投票:0回答:3

这里是问题,我需要用Java来做:我需要创建一个具有十六进制值的字节数组,以通过套接字发送到设备。消息格式是这样的

STX cmd1 Arg1,cmd2 ETX校验和//任何数量的命令和参数

示例:STX A 1 ETX 148 // 1和148以十进制表示STX是0x02,ETX是0x03,不是文本STX和ETX。

以上示例要生成的字节数组是这个:

    STX         A            1         ETX         148
    {(byte)0x2,(byte)0x41,(byte)0x31,(byte)0x3, (byte)0x94}

您能帮我吗?如何转换这些数字/字符并分配给字节数组?

java hex bytearray checksum
3个回答
1
投票

除非我没有记错,否则您已经朝着正确的方向前进。

要了解的一些事情,无符号字节从0到255(0x00到0xFF)。在Java中,只有带符号的数据类型,并且字节从-128到+127。

System.out.println(Byte.MIN_VALUE); // -128
System.out.println(Byte.MAX_VALUE); // +127

如果字段3和5是int,则将它们强制转换为byte很好,但要知道,当转换为字节时,超过+127的任何内容都将溢出到负数范围。

System.out.println((byte)0x94); // -108
System.out.println((byte)148);  // -108

如果想要字节的实际正值,则可以将每个字节与0xFF相对AND

System.out.println(((byte)-108) & 0xFF); // +148
System.out.println(((byte)-1) & 0xFF);   // +255

0
投票

您不能只使用Sotirios Delimanolis在注释中提出的内容,然后将char变量放在其中吗?

char a = 'A';
char b = '1';
byte[] buffer = {(byte)0x2, (byte)a, (byte)b, (byte)0x3, (byte)0x94};

或者我在这里想念什么吗?


0
投票

这对我有用:

public static byte[] hexToByteData(String hex)
{
    byte[] convertedByteArray = new byte[hex.length()/2];
    int count  = 0;

    for( int i = 0; i < hex.length() -1; i += 2 )
    {
        String output;
        output = hex.substring(i, (i + 2));
        int decimal = (int)(Integer.parseInt(output, 16));
        convertedByteArray[count] =  (byte)(decimal & 0xFF);
        count ++;
    }
    return convertedByteArray;
}
© www.soinside.com 2019 - 2024. All rights reserved.