- 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でもない環境でも実装可能なように考慮したのでしょうか?
|