作者claudehsu (低调)
看板java
标题[J2SE] 请问int转成4个bytes的问题
时间Mon Jan 18 17:35:24 2010
各位大哥您好,最近在写一个RS232跟硬体沟通的程式,需要把int转成4个bytes再放入
bytebuffer里面,其中int转bytes程式码如下:
byte pTime[] = new byte[4];
pTime[0] = (byte)( ((posixtime & 0xFF000000) >>> 24) & 0xFF);
pTime[1] = (byte)( ((posixtime & 0x00FF0000) >>> 16) & 0xFF);
pTime[2] = (byte)( ((posixtime & 0x0000FF00) >>> 8) & 0xFF);
pTime[3] = (byte)( ((posixtime & 0x000000FF) ) & 0xFF);
posixtime为任一正整数,我是使用系统时间的秒数,如下
int posixtime=(int)(rightNow.getTimeInMillis()/1000);
但转成bytes後,超过128的数值都会变成负数,这是因为JAVA的byte
是signed byte,请问我该如何把它转成unsigned byte,放入bytebuffer里
,可以正确的透过RS-232写出去???
麻烦各位大哥能替小弟解答一下...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.115.79.194
1F:→ pico2k:java 没有unsigned byte... 01/18 18:05
2F:推 snowlike:un不un的bits模样都相同,第一个&不需要,右移补零请斟酌 01/18 18:22
3F:→ claudehsu:→我知道没有unsigned byte,现在问题就是不要有负数 01/18 18:27
4F:→ claudehsu:→因为只要>128的数字就自动变负的,这样去checksum会错 01/18 18:33
5F:→ pico2k:请改用int来做checksum... 01/18 18:47
6F:→ claudehsu:→谢谢,我try看看 01/18 19:30
7F:→ claudehsu:我终於试成功,只是我的疑问还是在,因为写出去还是byte 01/18 20:22
8F:→ corevalue:singed 跟 unsigned 只是表示法不同而已 01/18 21:27
9F:→ corevalue:sig:-2(0xFE)+1=-1(0xFF),unsig:254(0xFE)+1=255(0xFF) 01/18 21:34
10F:→ corevalue:checksum 结果应该是一样的 01/18 21:35
11F:推 corevalue:signed跟unsigned有差的地方:1.小转大(byte->int), 01/18 21:59
12F:→ corevalue:2. ">>"後的运算..如 OR, AND 01/18 22:01
13F:→ claudehsu:→在JAVA就有差,因为signed的话,超过128就变负,会错 01/18 23:59
14F:→ sbrhsieh:对不懂的人才会有差~~~ 01/19 02:05
16F:→ sbrhsieh:照这样子的做法并注意 endianness。 01/19 02:15