我正在尝试获取十六进制值并将其移入字节数组。当我这样做时,他们并没有改变我需要的样子。它们大多数都转换为负数。例如,在执行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解释无符号类型中最高有效位的方式-
-128
与128
。差异是256
,这是209
和-47
之间的差异。您可以按原样发送值,因为位值相同,所以仅此位模式的解释不同。如果想将值
-47
转换为209
以说服Java,则可以将类型提升为更长的原始类型并屏蔽掉最后8位。该行将完成这一行,因此您可以进行调试,看看这些位是相同的,并且无符号版本是等效的。int test = baCommandPDI[0] & 0xFF;
打印/调试
test
将使您看到值209
。关于java - 如何在Java中将十六进制值(例如:0xD1)转换为无符号字节?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31122691/