[J2SE] 請問int轉成4個bytes的問題

看板java作者 (低調)時間16年前 (2010/01/18 17:35), 編輯推噓2(2014)
留言16則, 5人參與, 最新討論串1/1
各位大哥您好,最近在寫一個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

01/18 18:05, , 1F
java 沒有unsigned byte...
01/18 18:05, 1F

01/18 18:22, , 2F
un不un的bits模樣都相同,第一個&不需要,右移補零請斟酌
01/18 18:22, 2F

01/18 18:27, , 3F
→我知道沒有unsigned byte,現在問題就是不要有負數
01/18 18:27, 3F

01/18 18:33, , 4F
→因為只要>128的數字就自動變負的,這樣去checksum會錯
01/18 18:33, 4F

01/18 18:47, , 5F
請改用int來做checksum...
01/18 18:47, 5F

01/18 19:30, , 6F
→謝謝,我try看看
01/18 19:30, 6F

01/18 20:22, , 7F
我終於試成功,只是我的疑問還是在,因為寫出去還是byte
01/18 20:22, 7F

01/18 21:27, , 8F
singed 跟 unsigned 祇是表示法不同而已
01/18 21:27, 8F

01/18 21:34, , 9F
sig:-2(0xFE)+1=-1(0xFF),unsig:254(0xFE)+1=255(0xFF)
01/18 21:34, 9F

01/18 21:35, , 10F
checksum 結果應該是一樣的
01/18 21:35, 10F

01/18 21:59, , 11F
signed跟unsigned有差的地方:1.小轉大(byte->int),
01/18 21:59, 11F

01/18 22:01, , 12F
2. ">>"後的運算..如 OR, AND
01/18 22:01, 12F

01/18 23:59, , 13F
→在JAVA就有差,因為signed的話,超過128就變負,會錯
01/18 23:59, 13F

01/19 02:05, , 14F
對不懂的人才會有差~~~
01/19 02:05, 14F

01/19 02:10, , 15F
可以參考一下這一篇:http://ppt.cc/f4TB
01/19 02:10, 15F

01/19 02:15, , 16F
照這樣子的做法並注意 endianness。
01/19 02:15, 16F
文章代碼(AID): #1BL2jVqM (java)