java的byte是有符號類型(java就沒有無符號類型的數據),值域:-0128~127
c#的byte是無符號類型數值,值域:0~255
這在依賴字符編碼處理程序中,兩者源代碼就不能通用了。
知道原因結局辦法就容易多了。
1.使用&與運算 int num1=byte[0]&0xff 與運算一下。
原理:0xff是十六進制整形(至少16位)在直接轉化為整形時是255,相當於0x00ff,其二進制表達為前面8個0,后面8個1.而我們知道任何數值與1與還等於其本身。但是0xff是整形至少16個位,byte只擁有8個位,與0x00ff的與運算就相當於吧byte擴充成至少16位的整形。轉換自然就OK了。但是不能用0xffff。這是為什么呢?如果是正數,沒有什么問題,其實與0xff與運算分為兩步,第一個把byte真實擴充為至少16位的整形,擴充的方式正數前用0填位,負數用1填位。所依負數就有問題了,因為java對於8位的負數(計算機系統負數表達形式用正數的補碼標示負數,即正數取反1變0,0變1,然后最后一位加1,這時候負數的第一位肯定是1)擴展位數時時前面是用1填充的,其實就變成0xff[byte]。0xff只是后面8位是1,其實就等於0x00ff,前面是0.與運算之后把負數系統自動擴展的1去掉了,就是一個變成正數了,但是用0xffff,如果是16位的整形,與負數與運算,就會保持不變。如果是32為的整形,就會變成一個更大的值0x0000ff[byte]。
2.直接加上無符號與有符號的插值。但是這個還要計算一輪始末的情況。