2个字节来缩短java

时间:2009-04-10 05:45:35

标签: java type-conversion byte core short

我正在读取来自serialport的133长度数据包,最后2个字节包含CRC值,2个字节值我使用java制作单个(我认为是短)。 这就是我所做的,

short high=(-48 & 0x00ff);
short low=80;

short c=(short) ((high<<8)+low);

但是我没有得到正确的结果,是因为签名有问题吗? 我怎么能解决这个问题,请帮我解决这个问题

6 个答案:

答案 0 :(得分:58)

请记住,如果您对细节不太熟悉,则不必将自己束缚在变速之中。您可以使用ByteBuffer来帮助您:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(firstByte);
bb.put(secondByte);
short shortVal = bb.getShort(0);

反之亦然,你可以缩短,然后拉出字节。

顺便说一下,按位运算会自动将操作数提升到至少int的宽度。实际上并没有“不允许超过7位的字节转换”这一概念以及其他传言似乎已经过去了。

答案 1 :(得分:26)

在Java中将字节值从流转换为数值时,您必须非常小心使用符号扩展。有一个带负数的陷阱(值来自(无符号)128-255)。

试试这个(如果hi和lo是任何Java整数类型,它都有效):

short val=(short)(((hi & 0xFF) << 8) | (lo & 0xFF));

我发现在这些情况下最好明确括号。

答案 2 :(得分:9)

其他答案还可以,但我想强调一下这个类型:

short high=(-48 & 0x00ff);
short low=80;

int c= ((high & 0xFF) << 8) | (low & 0xFF);

short类型可以表示介于-32768到32767之间的值。53328不能很好地存储,请使用int,因为它允许存储无符号值~10 9 因此,不要将表达式向下转换为short,因为它会使符号值符合你的意思。

答案 3 :(得分:6)

当尝试连接字节(非常微妙)

时会发生这种情况
byte b1 = (byte) 0xAD;
byte b2 = (byte) 0xCA;
short s = (short) (b1<<8 | b2);

以上产生0xFFCA,这是错误的。 这是因为b2是负数(字节类型是有符号的!),这意味着当它将按位转换为int类型时操作,它将被填充为0xF!

因此,您必须记住屏蔽填充的字节,以便它们肯定为零:

short s = (short) (b1<<8 | b2 & 0xFF);

答案 4 :(得分:2)

您可以以更易读,更优雅的方式将2个字节转换为短片。

OnMessageReceived

第一个字节是最重要的字节。

答案 5 :(得分:0)

这对我有用

{{1}}