- PR -

数値からバイト列への変換

1
投稿者投稿内容
JIN
会議室デビュー日: 2002/07/03
投稿数: 8
投稿日時: 2005-02-22 14:41
.NETでは、数値からバイト列への変換するのに、
http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html
でも記載されているようにSystem.BitConverterクラスを使用します。

Javaでは皆さんどうしていますか?
いろいろ探してはいるのですが、見当たりません。
Integer.toHexString(int)を使用して一旦Stringするような、
回りくどいことしなければならないのでしょうか?
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2005-02-22 14:54
java.io.DataOutputStream
とかでしょうか
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2005-02-22 15:24
java.nio.ByteBuffer
とか。
JIN
会議室デビュー日: 2002/07/03
投稿数: 8
投稿日時: 2005-02-22 16:29
引用:

ナキヲさんの書き込み (2005-02-22 14:54) より:
java.io.DataOutputStream
とかでしょうか


ナキヲさん、yamasaさんありがとうございました。
とりあえず DataOutputStreamを使用して以下のように可能であることを確認しました。
コード:

import java.io.*;

class IntToByte {
public static void main(String args[]) {
DataOutputStream dos = null;

try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
dos = new DataOutputStream(baos);

int value = 0x208040FF;
dos.writeInt(value);
System.out.println("size = " + baos.size());
byte[] byteArray = baos.toByteArray();

for (int i = 0; i < baos.size(); i++) {
System.out.println("[" + i + "]" + byteArray[i]);
}
}
catch (Exception e) {
System.out.println(e.getMessage());
}
finally {
try {
dos.close();
}
catch (IOException e) {
}
}
}
}




[ メッセージ編集済み 編集者: JIN 編集日時 2005-02-22 16:39 ]
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2005-02-22 17:13
単純に、endian決め打ちで int→byte[4]の変換をしたいだけなら、
コード:

public static byte[] getBytes(int n)
{
byte[] b = new byte[4];
b[0] = (byte)(n >>> 0 );
b[1] = (byte)(n >>> 8 );
b[2] = (byte)(n >>> 16);
b[3] = (byte)(n >>> 24);
return b;
}


のような単純な変換で可能です(この例は、little endian)。

「その実行環境でのnativeなendian」が欲しいのであれば、javaではたぶん不可能です。
(Javaの言語仕様では、「生のendian」を取り出す手段がなさそう)

[ メッセージ編集済み 編集者: coasm 編集日時 2005-02-22 17:14 ]
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-02-22 17:31
引用:

coasmさんの書き込み (2005-02-22 17:13) より:

「その実行環境でのnativeなendian」が欲しいのであれば、javaではたぶん不可能です。
(Javaの言語仕様では、「生のendian」を取り出す手段がなさそう)




ぢつは、JDK1.4からは取れたりします。
java.nio.ByteOrder#nativeOrder()
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2005-02-22 17:36
big endianならこんな感じ。
コード:
int value = 0x208040FF;
byte[] byteArray = new byte[4];
ByteBuffer.wrap(byteArray).putInt(value);
for (int i = 0; i < byteArray.length; i++) {
  System.out.println("[" + i + "]" + byteArray[i]);
}



little endianならこう。
コード:
ByteBuffer.wrap(byteArray).order(ByteOrder.LITTLE_ENDIAN).putInt(value);



「その実行環境でのnativeなendian」なら、こうです。
コード:
ByteBuffer.wrap(byteArray).order(ByteOrder.nativeOrder()).putInt(value);

coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2005-02-22 19:53
なるほど、そりゃそうか。
java.nio は「生のメモリー」「生のI/O」のためのパッケージだから、
「生のendian」が見えるわけか。

# しかし、「嘘をついた場合でも破綻しない」ような仕様になっているのは、
# littleでもbigでもない環境でも実装可能なように考慮したのでしょうか?


1

スキルアップ/キャリアアップ(JOB@IT)