Discussion:
[分享] byte[]計算
(时间太久无法回复)
骨頭
2007-03-25 10:26:21 UTC
Permalink
最近碰到的鳥問題就是因為存檔的關係,
所以int被轉成4個byte,有些short被轉成2個byte,


這時候就需要一些計算把他們還原。
主要的計算法則是 & 後平移再|,


比方說兩位的short就是
(b[0] & 0xFF) | (b[1] << 8 & 0xFF00)



int transByteIntoInt(byte[] b){
if (b.length==0) return -1;

int addr = b[0] & 0xFF;
for(int i=1;i<b.length;i++)
addr |= ((b[i] << 8*i) & (0xFF)*(int)Math.pow(256,i));
return addr;

}


--
因為困擾我三個多小時,所以貼上來一起討論囉。XD
btw,
我用DatainputStream配 byteInputStream一直失敗,不曉得為甚麼。

--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
愚人
2007-03-25 10:47:22 UTC
Permalink
※ 引述《TonyQ (骨頭)》之銘言:
: 最近碰到的鳥問題就是因為存檔的關係,
: 所以int被轉成4個byte,有些short被轉成2個byte,
: 這時候就需要一些計算把他們還原。
: 主要的計算法則是 & 後平移再|,
: 比方說兩位的short就是
: (b[0] & 0xFF) | (b[1] << 8 & 0xFF00)
: int transByteIntoInt(byte[] b){
: if (b.length==0) return -1;
: int addr = b[0] & 0xFF;
: for(int i=1;i<b.length;i++)
: addr |= ((b[i] << 8*i) & (0xFF)*(int)Math.pow(256,i));
: return addr;
: }

endian problem

http://tinyurl.com/2cvxym

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.161.125.35
骨頭
2007-03-25 12:40:23 UTC
Permalink
※ 引述《qrtt1 (愚人)》之銘言:

: ※ 引述《TonyQ (骨頭)》之銘言:
: : }
: endian problem
: http://tinyurl.com/2cvxym

搞懂了

原來是存檔是 byte從低階存到高階 (little-endian)
還有從高階存到低階 (big-endian) 兩者在讀檔上不同所造成的問題。


Java預設是big-endian,我讀的檔案剛好是little-endian,orzorz

我找到一個參考用的InputStream (它繼承DataInputStream 做擴充)
http://www.cs.cornell.edu/courses/cs212/2001fa/
Project/Part1/le/LEDataInputStream.java.

總算解決這個問題了。(淚)


--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the compiler will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68

Loading...