【问题标题】:creating hex byte array in java在java中创建十六进制字节数组
【发布时间】:2015-05-22 23:40:22
【问题描述】:

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

STX cmd1 Arg1 , cmd2 ETX Checksum // 任意数量的命令和参数

示例: 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}

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

【问题讨论】:

  • 什么? byte[] buffer = {(byte)0x2,(byte)0x41,(byte)0x31,(byte)0x3, (byte)0x94};
  • @SotiriosDelimanolis 谢谢,如何将 Ato 0x41 、 148 转换为 0x94 并分配给字节数组是个问题。给出的是一个例子。 STX 和 ETX 是静态的,但 A 和 1 会有所不同。
  • @SotiriosDelimanolis 这些是设备命令,例如 1) A ,1 , 2) P,10 3) ?K 等。我必须将校验和附加到那个(0-256)。所有这些我都必须以所讨论的格式发送。
  • 您在 Java 中的输入是什么?这些是字符串、字符、字节还是整数?我们正在从一种事物转变为另一种事物。我们需要知道它们的类型。
  • @SotiriosDelimanolis 仅整数和字符,双倍我必须解析并作为单个数字发送,包括点(。)

标签: java hex bytearray checksum


【解决方案1】:

除非我弄错了,否则你已经朝着正确的方向前进了。

有几件事要知道,无符号字节从 0 到 255(0x00 到 0xFF)。在 Java 中,只有带符号的数据类型,一个字节从 -128 到 +127。

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

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

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

如果您想要字节的实际正值,您可以AND 每个字节对应 0xFF。

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

【讨论】:

  • 非常感谢您的评论。有了你的回答,我已经接近解决方案了,只有一个问题。如果我得到这个查询的答案,我可能会实现目标。 System.out.println((byte)0x31) 和 System.out.println((byte)1) 不应该打印相同的答案 49 吗?我第一次得到 49,第二次得到 1。这就是我现在卡住的地方。如果我的第三个字段值为 1,我期待 49(0x31),但我得到 1(0x1)
  • @Shar1e80 ,我遇到了问题。 1 和 '1' 之间的混淆。你的解释对我很有帮助。非常感谢
【解决方案2】:

难道您不能直接使用 Sotirios Delimanolis 在 cmets 中提出的方法并将您的 char 变量放入其中吗?

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

或者我在这里遗漏了什么?

【讨论】:

  • 谢谢,你引用的那个可以,但问题是,b 是一个整数,也可以是两位或三位数字。如果我在不带引号的情况下分配 char b = 1 (' ') ,它将以 0x1 的形式出现,而不是 0x31。在问题中, 148 应该动态填充为 0x94 - 它不是硬编码的。
猜你喜欢
  • 2013-06-24
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2015-08-08
  • 2018-02-28
  • 2013-01-18
相关资源
最近更新 更多