我正在尝试获取十六进制值并将其移入字节数组。当我这样做时,他们并没有改变我需要的样子。它们大多数都转换为负数。例如,在执行C#代码“ baCommandPDI [0] = 0xD1;”之后,baCommandPDI [0]的值为“ 209”。这就是我所需要的。无论我在Java中尝试什么,该值都是“ -47”。我需要它在字节数组中为“ 209”,因为此字节数组是通过TCP / IP发送到某些外部硬件的。外部硬件无法将-47解释为209。它必须是209。我尝试了以下代码:

int intTemp = 0xD1;执行此行后,intTemp的值为209,太好了!

int intHexValue = 0xD1&0xFF;执行此行后,intHexValue的值仍为209,我不知道如何,但是它是什么。

baCommand [0] =(字节)intHexValue;执行此行后,baCommand [0]的值是-47,不好。这不是我想要的。每次将值转换为字节时,都会对其进行签名。

我还有其他方法可以做到吗?我可以使用11010001吗?如何在不使其为负数的情况下将该值分配给一个字节?

最佳答案

在Java中,byte始终是带符号的。但是,就像另一种语言中的无符号byte一样,仍使用8位。 byte(无符号)和209-47表示形式相同。

1101 0001


唯一的区别是Java解释无符号类型中最高有效位的方式--128128。差异是256,这是209-47之间的差异。您可以按原样发送值,因为位值相同,所以仅此位模式的解释不同。

如果想将值-47转换为209以说服Java,则可以将类型提升为更长的原始类型并屏蔽掉最后8位。该行将完成这一行,因此您可以进行调试,看看这些位是相同的,并且无符号版本是等效的。

int test = baCommandPDI[0] & 0xFF;


打印/调试test将使您看到值209

关于java - 如何在Java中将十六进制值(例如:0xD1)转换为无符号字节?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31122691/

10-12 03:25