2011-05-20 6 views
10

RandomAccessFileクラスにreadUnsignedInt()メソッドが存在しないことが判明しました。どうして?ファイルから符号なしintを読み取るための回避策はありますか?なぜRandomAccessFileクラスのreadUnsignedIntはありませんか?

編集:

は、私は、ファイルからunsigned int型を読み、長いスペースに入れたいです。

EDIT2:

のreadLongを使用することはできません()。 4バイトではなく8バイトを読み込みます。ファイル内のデータは4バイトの範囲で符号なし整数を持ちます。

EDIT3:ここ

見つかり答え:http://www.petefreitag.com/item/183.cfm

Edit4:

どのようにデータファイルがリトルエンディアンの場合はどうですか?まずスワップする必要がありますか?

+3

Javaは符号なし整数をサポートしていません。 @stackoverflow.com/questions/430346/why-doesnt-java-support-unsigned-ints – Swati

+1

@スワティ:そうですね、2バイトを読み込んでintを返す 'readUnsignedShort()'のようにできました。 :4バイトを読み取り、longを返します。 – musiKk

+0

彼らはunsigned intを実装している可能性もありますが、何ができますか? – Swati

答えて

19

私は思いますそれは次のようなものです:

long l = file.readInt() & 0xFFFFFFFFL; 

アップキャストが負の符号を延長するため、ビット操作が必要です。


エンディアンについて。私の知る限りでは、JavaのI/Oはすべてビッグエンディアン形式で行われます。もちろん、バイト配列、UTF-8エンコーディングなどはエンディアンの影響を受けませんが、多くの方法がDataInputです。あなたの番号がリトルエンディアンに格納されている場合は、それを自分で変換する必要があります。私が知っている標準的なJavaの唯一の機能は、エンディアン設定がByteBufferで、order()メソッドを使用していますが、NIOへのゲートを開いて、それに多くの経験はありません。

+1

+1良い提案! – aioobe

+1

はい、それはより良い解決策です:) –

+0

0xFFFFFFFFの最後に "L"がないと、この解決法は機能しません.Lが指定されていない場合は、数字が負の値になります –

2

javaにはunsigned int型がないので、 なぜかreadLong()? 長く続き、最初の32ビットを読むことができます。

編集 はあなたがreadLong()を削除するように編集

long value = Long.parseLong(Integer.toHexString(file.readInt()), 16); 
+0

* javaにはunsigned int型がないため、実際には 'readUnsignedByte' ... – aioobe

+0

' readLong() 'が多すぎるバイトを消費するため、' seek() 'を使って4バイト戻ってしまいますか? – musiKk

+0

@aioobe、はい、申し訳ありませんが、これらの方法に気付かなかった。 –

3

を試すことができます。

あなたはreadFully(byte[] b, int off, int len)を使用して、ここでの方法でLongに変換することができます:How to convert a byte array to its numeric value (Java)?

+1

それはあまりにも多くのバイトを食べるでしょうか? – aioobe

+0

ファイル内の数値が4バイトの場合、これは役に立ちません。 'readLong()'は8バイトを読み込みます。 – musiKk

+0

本当に 'readFully()'を使って変換することができます。 –

0

intで何をしているかによって、長いものにする必要はありません。実行している操作を認識するだけで済みます。すべての32ビットの後、あなたはあなたが望むように、それを符号付きまたは無署名として扱うことができます。

ByteOrderで再生したい場合、最も簡単なことはByteBufferを使用してバイトオーダーを設定できることです。ファイルが2 GB未満の場合は、ファイル全体をメモリにマップし、ランダムにByteBufferにアクセスできます。

関連する問題