プロが教える店舗&オフィスのセキュリティ対策術

int型の内容をbyteの配列にコピーする方法を教えて下さい。

int i_value = 500;
byte[] by_value;
by_value = new byte[4];

// どのような処理が必要ですか?


by_value[0]には、0x1
by_value[1]には、0xf4
と格納したいです。
数字→文字列→文字(byte)できたのですが…。
C言語の場合、memcpy関数で型が異なってもキャストすれば回避できました。
JAVAでの方法を教えて下さい。

A 回答 (3件)

とりあえず私の環境では


キャストしないとエラーになりました。
by_value[0] = (byte)(i_value & 0xff) ;
by_value[1] = (byte)((i_value>>8) & 0xff) ;
by_value[2] = (byte)((i_value>>16) & 0xff) ;
by_value[3] = (byte)((i_value>>24) & 0xff) ;
    • good
    • 0
この回答へのお礼

キャストも必要でしたね。

忘れないように気をつけます。

お礼日時:2003/07/16 19:10

>リトルエンディアンなのかビッグエンディアンなのか解らないので、


>C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね?

というかCPUに依存します。
intel系だとリトルエンディアン
sun系だとビッグエンディアン

異なるCPU間で同じ結果をもたらしたいのなら
先にintel系かどうかを判定するか
シフト演算子は使わず、数学的に
対処するのが懸命です。
b[0] = (byte)(i_value / 0xff)
b[1] = (byte)(i_vakue % 0xff)
    • good
    • 0
この回答へのお礼

本題とは異なりますが、ありがとうございます。

JAVAでもCPUに依存するのですね。
C言語だと、環境が異なったら再コンパイルしていました
が、JAVAでは、最コンパイルというのは、あまりしない
ようなので、CPUがどの系統化を判断しなくてはならない
のですね。
これについては調査し、不明点等があったら別途質問
させていただきます。

ありがとうございました。

お礼日時:2003/07/18 00:25

こんにちは



プログラム言語に依存しなくても良いのでは。
リトルエンディアンなのかビッグエンディアンなのか解らないので、

by_value[0] = (i_value&0xff) ;
by_value[1] = ((i_value>>8)&0xff) ;
by_value[2] = ((i_value>>16)&0xff) ;
by_value[3] = ((i_value>>24)&0xff) ;
または
by_value[3] = (i_value&0xff) ;
by_value[2] = ((i_value>>8)&0xff) ;
by_value[1] = ((i_value>>16)&0xff) ;
by_value[0] = ((i_value>>24)&0xff) ;

ご希望に添う方で良いと思いますよ。
forループとか使っても良いですが、大した処理じゃないですね。

for (int i=0,j=0 ;i<4 ;i++,j+=8){
  by_value[i] = ((i_value>>j)&0xff) ;
}
または
for (int i=0,j=24 ;i<4 ;i++,j-=8){
  by_value[i] = ((i_value>>j)&0xff) ;
}

ご希望に添っていなければごめんなさい。
    • good
    • 0
この回答へのお礼

マスクという方法がありましたね。
ビット操作は、しばらく離れていたので忘れてました。

ありがとうございました。

>リトルエンディアンなのかビッグエンディアンなのか解らないので、
C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね?

お礼日時:2003/07/16 19:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A