作者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