3

ファイル(連続したバイトとして格納されている)から符号なし整数を読み取り、それらを整数に変換しようとしています。私はこれを試しました:

file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value  will be less than expected

私はここで何が間違っているのですか?

4

6 に答える 6

5

十分なバイトを読み取っていません。タッドマンの答えへのコメントであなたが言うように、あなたは202代わりに得る3405691582

の最初の2バイト0xCAFEBABE0xCA=であることに注意してください202

本当に1つの数値に8バイトすべてが必要な場合は、unsignedshortよりも多くを読み取る必要があります。

試す

num = file.read(8).unpack("L_")

アンダースコアは、ネイティブのlongが8バイトになることを前提としていますが、これは確実に保証されるものではありません。

于 2009-08-25T00:10:45.780 に答える
4

つるはしを見てみませんか?(Ruby 1.9、p。44)

File.open("testfile") 
do |file|
    file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end

each_byteは、ファイルをバイトごとに繰り返します。

于 2010-12-05T16:37:17.940 に答える
2

Rubyでバイナリデータを解析するのに役立つライブラリがいくつかあります。これにより、単純な高レベルの宣言型DSLでデータ形式を宣言し、彼ら自身。

私はこれらの1つを使用したことがありませんが、ここに2つの例があります。(もっとありますが、私はそれらを知りません):

于 2009-08-25T15:02:52.477 に答える
1

わかりました、動作しました:

num = file.read(8).unpack("N")

皆様のご協力に感謝いたします。

于 2009-08-25T15:30:05.920 に答える
0

ファイルに保存されている番号はどのような形式ですか?16進数ですか?あなたのコードは私には正しいように見えます。

于 2009-08-24T21:02:27.317 に答える
0

バイナリデータを処理する場合、Windowsを使用している場合は、ファイルをバイナリモードで開いていることを確認する必要があります。これは、読み取りと書き込みの両方に当てはまります。

open(filename, "rb") do |file|
  num = file.read(2).unpack("S")
  puts num
end

ソースプラットフォームによっては、「エンディアン」エンコーディングにも問題がある場合があります。たとえば、古いMacシステム、IBM Powerサーバー、PS3クラスター、またはSunSparcサーバーを含むPowerPCベースのマシン。

それがどのように「少ない」かという例を投稿できますか?通常、データには明らかなパターンがあります。

たとえば、0x1234が必要なのに、0x3412が得られた場合、これはエンディアンの問題です。

于 2009-08-24T21:02:30.810 に答える