• ベストアンサー

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での方法を教えて下さい。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

とりあえず私の環境では キャストしないとエラーになりました。 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) ;

asaichi
質問者

お礼

キャストも必要でしたね。 忘れないように気をつけます。

その他の回答 (2)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

>リトルエンディアンなのかビッグエンディアンなのか解らないので、 >C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね? というかCPUに依存します。 intel系だとリトルエンディアン sun系だとビッグエンディアン 異なるCPU間で同じ結果をもたらしたいのなら 先にintel系かどうかを判定するか シフト演算子は使わず、数学的に 対処するのが懸命です。 b[0] = (byte)(i_value / 0xff) b[1] = (byte)(i_vakue % 0xff)

asaichi
質問者

お礼

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

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

こんにちは プログラム言語に依存しなくても良いのでは。 リトルエンディアンなのかビッグエンディアンなのか解らないので、 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) ; } ご希望に添っていなければごめんなさい。

asaichi
質問者

お礼

マスクという方法がありましたね。 ビット操作は、しばらく離れていたので忘れてました。 ありがとうございました。 >リトルエンディアンなのかビッグエンディアンなのか解らないので、 C言語では、この問題に遭遇しましたが、JAVAではどうなのですかね?

関連するQ&A

  • byte[2] から int へ。

    それぞれintの下位2バイトのビット列保持するbyte型配列の要素2つを int 形の整数に治したいのですがいい方法が思いつきません。例えば、 byte[0] = 0x01; byte[1] = 0x01; ならば、 00000000 00000000 00000001 00000001 で、256 + 1 = 257 byte[0] = 0x02; byte[1] = 0x10; ならば、 00000000 00000000 00000010 0000011 で、512+3 = 515 です。byteの値が0~127の場合は int n = byte[0] << 8 n = n | byte[1] という感じでいけそうなのですが、byte[0]が 0xFF のような負の値のときにint とのビット演算(もしくはシフト演算)で上位2バイト分も補数表記のためか全部1で埋まってしまい、上の方法はだめみたいです。 byte[0] = 0x01; byte[1] = 0xFF; のときは、 00000000 00000000 00000001 11111111 で、256+255 = 511 としたいのですが、場合わけをせずに求める よい方法はないでしょうか。

    • ベストアンサー
    • Java
  • byte配列の途中から2個ずつintに移すには?

    byte配列の途中から2個ずつintに移すには? Byte[] recvData={02:03:04:05:06:01:00:02:00:FF:FF:05} int nCount; =3;//データn個ください。 List<int> ValueList = new List<int>();//格納用 for (int i = 0; i < nCount; i++) {   //[0]~[4]までヘッダ+サブヘッダ。データは[5]から2byteずつ ValueList.Add(recvData[5 + i * 2] | (recvData[6 + i * 2] << 3)); }; という感じで、溜まったbyte配列の受信データから 0001、0002、65535とデータ部分を2byteずつ取り出したいのですが もうちょっとC#なら簡潔な書き方ってあるのでしょうか?

  • javaのbyte配列へintなどを埋め込む方法

    javaのbyte配列へintなどを埋め込む方法 java初心者です。データ編集がわからなくて悩んでいます。 下記のコードは"棒読みちゃん"といソフトへのTCPパケットを作成するコードです。 char buf[15]; *((short*)&buf[0]) = 0x0001; *((short*)&buf[2]) = speed; *((short*)&buf[4]) = tone; *((short*)&buf[6]) = volume; *((short*)&buf[8]) = voice; *((char* )&buf[10]) = 2; *((long* )&buf[11]) = len; 同じことをJAVAでしたいのですがわかりません。 (バイト型配列へint,long型を簡単に埋め込む方法がわかりません) よろしくお願いします。 よかったら、こちらもお願いします memcpy(&buf[15],message,strlen(messege)); TCPパケットのようなデータ処理が頻繁にある場合、 このようなコードは、どうしたらいいでしょうか? *((unsigned char* )&buf[15]) = message; CとJAVAになってますが、このような処理を簡単に書けないでしょうか?

    • ベストアンサー
    • Java
  • int配列をbyte配列に変換

    MIDPアプリを作成している初心者です。 Image データを一旦端末のレコードストアに保存しておく為、 getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。 ↓のように レコードストアに書き込むメソッドを書いてみました。 public void writeRecordStore( String name, Image image ) {     int width = image.getWidth();     int height = image.getHeight();     int[] pxData = new int[ width*height ];     byte[] byteData;     RecordStore rs = null;     try {         //画像をバイトデータに変換         image.getRGB( pxData, 0, width, 0, 0, width, height );         //レコードストアを開く         rs = RecordStore.openRecordStore( name, true );         //バイト配列に変換 ← ここがわからない                  //レコードの追加         rs.addRecord( byteData, 0, byteData.length );              } catch( Exception e ) {     } } int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。 また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

    • ベストアンサー
    • Java
  • [VB.net] StringからByte配列への変換

    皆さんこんばんは。 最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。 VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。 CByte( Mid(str,i,1) ) CLng( Mid(str,i,1) ) 他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。 ("『"を上下反転したような文字) ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。 よろしくお願いします。

  • byteをDBに格納

    sqlserver 2008 framework3.5 SP1 C# すみません。 C#初心者です。上の情報で十分ですか? いま、データをDBに格納したく奮闘しております。 まず、格納したいものは、以下のような16進数のデータです。 「1E0015・・・」 いまはbool配列に{0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1・・・}のデータを8個ずつ int配列に{30, 0, 5,・・・}と変換して byte配列に{1E,0,15・・・}と変換しています。 bool配列からbyte配列に変換する方法はありますでしょうか? また、byte配列のDBへの格納方法も合わせてお教えいただけると助かります。 よろしくおねがいします。

  • Java intの扱い

    こんにちは、Javaを勉強しているものです。 小さなデータ(byteなど)をより大きないれもの(intなど)に入れるときには、暗黙的なキャストがおこなわれます。 逆に、大きな値を小さないれものに入れるための変換を「縮小変換」と呼び、これには明示的なキャストが必要だと習いました。 そこで、次のようなコードがあった場合、これは明示的なキャストが必要なのではないのでしょうか? byte b = 3; これは、コンパイルエラーにはならないのですが、 3はint型であり、bはbyte型なので、大きな値を小さな小さないれものに入れているということになります。本来であれば byte b = (byte)3; と書くべきではないのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Byteについて

    おはようございます。お世話になっています。 基本データ型の値をコンストラクタによってカプセル化する際に、intであれば値をそのまま、longであればLをサフィックスとして付けて記述するのですが、byteはどのようにすれば良いのでしょうか?色々試した結果、キャスト演算子を使って(byte)12のようにするとbyte型として認識してくれました。これ以外に何か数値をbyte型にする方法は有るのでしょうか?よろしくお願いします。

    • ベストアンサー
    • Java
  • byte配列をImageに変換する

    現在Javaでネットワーク越しに画像データを送るプログラムを書いているのですが、byte配列に変換した画像データを、元の画像データに戻せなくて困っています。 もう少しプログラムよりにかくと、BufferdImageをbyte[]には変換できますが、逆ができません。 何かよい方法はないのでしょうか?お返事お待ちしております。

    • ベストアンサー
    • Java
  • int型の変数値をバイト列としてコピー

    あるint型の変数に格納されている情報を、バイト列としてコピーする方法で困っています。 変数の入っている領域をそのままコピーしたいので、memcpyを使うかと思うですが、 コピーされた結果を見ると文字列の並びが逆転しているように見えます。 --サンプルコード抜粋 unsigned int i= 12345; unsigned char *c; c = (char *)malloc(sizeof(int)); printf("i_hex=%x\n",i); memcpy(c,(int *)&i,sizeof(int)); 出力結果 i_hex=3039 cの出力結果 3930000000 単純にmemcpyではダメなのでしょうか? 実行環境は、CentOS(32bit)+gccです。よろしくお願いします。

専門家に質問してみよう