看板 java 關於我們 聯絡資訊
各位大哥您好,最近在寫一個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
pico2k:java 沒有unsigned byte... 01/18 18:05
snowlike:un不un的bits模樣都相同,第一個&不需要,右移補零請斟酌 01/18 18:22
claudehsu:→我知道沒有unsigned byte,現在問題就是不要有負數 01/18 18:27
claudehsu:→因為只要>128的數字就自動變負的,這樣去checksum會錯 01/18 18:33
pico2k:請改用int來做checksum... 01/18 18:47
claudehsu:→謝謝,我try看看 01/18 19:30
claudehsu:我終於試成功,只是我的疑問還是在,因為寫出去還是byte 01/18 20:22
corevalue:singed 跟 unsigned 祇是表示法不同而已 01/18 21:27
corevalue:sig:-2(0xFE)+1=-1(0xFF),unsig:254(0xFE)+1=255(0xFF) 01/18 21:34
corevalue:checksum 結果應該是一樣的 01/18 21:35
corevalue:signed跟unsigned有差的地方:1.小轉大(byte->int), 01/18 21:59
corevalue:2. ">>"後的運算..如 OR, AND 01/18 22:01
claudehsu:→在JAVA就有差,因為signed的話,超過128就變負,會錯 01/18 23:59
sbrhsieh:對不懂的人才會有差~~~ 01/19 02:05
sbrhsieh:可以參考一下這一篇:http://ppt.cc/f4TB 01/19 02:10
sbrhsieh:照這樣子的做法並注意 endianness。 01/19 02:15