質問

ようにしている読み符号なし整数からファイルとして格納された連続バイト)に変換し整数です。またこの:

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

なぜですか。

役に立ちましたか?

解決 4

[OK]を、私はそれが動作するようになった。

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

あなたの助けのすべてをお寄せいただきありがとうございます。

他のヒント

あなたは十分なバイトを読んでいません。あなたはtadmanの答えにコメントで言うように、あなたは202代わりの3405691582を取得

注意0xCAFEBABEの最初の2バイトであること0xCA = 202

あなたは本当に、単一の番号のすべての8つのバイトをしたい場合は、

、その後、あなたは符号なしshort以上のものを読む必要がある。

してみてください。

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

アンダースコアは、ネイティブロングは間違いなく保証されていない8バイトで、あることを行っていると仮定されます。

どのようにつるはしで探してはどうですか? (ルビー1.9、P。44)

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

バイトによるファイルのバイトを超えるeach_byteが繰り返さます。

あるカップルでのライブラリを解析バイナリデータをRubyによるきを宣言するデータ形式の簡単なレベルの高いコDSLとしてすべての梱包、開梱、ビット-twiddlingに移行とエンディアン-変換する。

私はいつもここの二つの例です。がありますが、わからない)になっている:

どのような形式の番号がファイルに保存されていますか?それは六角でますか?あなたのコードは、私には正しいようます。

バイナリデータを扱う場合には、

あなたがWindows上している場合は、バイナリモードでファイルを開いていることを確認する必要があります。これは、読み取りと書き込みの両方のために行く。

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

また、ソース・プラットフォームに応じて、「エンディアン」のエンコードに問題があるかもしれません。例えば、古いMacシステム、IBMのPowerサーバー、PS3クラスタ、またはSun SPARCサーバを含めたPowerPCベースのマシン、。

あなたはそれが「少ない」だ方法の例を投稿することができますか?通常、データへの明白なパターンがあります。

あなたが0x1234のを望んでいますが、0x3412を取得する場合

たとえば、それはエンディアン問題です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top