- ベストアンサー
int型の内容をbyteの配列にコピー
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での方法を教えて下さい。
- みんなの回答 (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) ;
その他の回答 (2)
- sha-girl
- ベストアンサー率52% (430/816)
>リトルエンディアンなのかビッグエンディアンなのか解らないので、 >C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね? というかCPUに依存します。 intel系だとリトルエンディアン sun系だとビッグエンディアン 異なるCPU間で同じ結果をもたらしたいのなら 先にintel系かどうかを判定するか シフト演算子は使わず、数学的に 対処するのが懸命です。 b[0] = (byte)(i_value / 0xff) b[1] = (byte)(i_vakue % 0xff)
お礼
本題とは異なりますが、ありがとうございます。 JAVAでもCPUに依存するのですね。 C言語だと、環境が異なったら再コンパイルしていました が、JAVAでは、最コンパイルというのは、あまりしない ようなので、CPUがどの系統化を判断しなくてはならない のですね。 これについては調査し、不明点等があったら別途質問 させていただきます。 ありがとうございました。
- arukamun
- ベストアンサー率35% (842/2394)
こんにちは プログラム言語に依存しなくても良いのでは。 リトルエンディアンなのかビッグエンディアンなのか解らないので、 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) ; } ご希望に添っていなければごめんなさい。
お礼
マスクという方法がありましたね。 ビット操作は、しばらく離れていたので忘れてました。 ありがとうございました。 >リトルエンディアンなのかビッグエンディアンなのか解らないので、 C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね?
お礼
キャストも必要でしたね。 忘れないように気をつけます。