ファイル(連続したバイトとして格納されている)から符号なし整数を読み取り、それらを整数に変換しようとしています。私はこれを試しました:
file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value will be less than expected
私はここで何が間違っているのですか?
十分なバイトを読み取っていません。タッドマンの答えへのコメントであなたが言うように、あなたは202
代わりに得る3405691582
の最初の2バイト0xCAFEBABE
は0xCA
=であることに注意してください202
本当に1つの数値に8バイトすべてが必要な場合は、unsignedshortよりも多くを読み取る必要があります。
試す
num = file.read(8).unpack("L_")
アンダースコアは、ネイティブのlongが8バイトになることを前提としていますが、これは確実に保証されるものではありません。
つるはしを見てみませんか?(Ruby 1.9、p。44)
File.open("testfile")
do |file|
file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end
each_byteは、ファイルをバイトごとに繰り返します。
わかりました、動作しました:
num = file.read(8).unpack("N")
皆様のご協力に感謝いたします。
ファイルに保存されている番号はどのような形式ですか?16進数ですか?あなたのコードは私には正しいように見えます。
バイナリデータを処理する場合、Windowsを使用している場合は、ファイルをバイナリモードで開いていることを確認する必要があります。これは、読み取りと書き込みの両方に当てはまります。
open(filename, "rb") do |file|
num = file.read(2).unpack("S")
puts num
end
ソースプラットフォームによっては、「エンディアン」エンコーディングにも問題がある場合があります。たとえば、古いMacシステム、IBM Powerサーバー、PS3クラスター、またはSunSparcサーバーを含むPowerPCベースのマシン。
それがどのように「少ない」かという例を投稿できますか?通常、データには明らかなパターンがあります。
たとえば、0x1234が必要なのに、0x3412が得られた場合、これはエンディアンの問題です。