Rubyからバイトを読み込むファイルに変換する整数
質問
ようにしている読み符号なし整数からファイルとして格納された連続バイト)に変換し整数です。またこの:
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
、その後、あなたは符号なし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が繰り返さます。
どのような形式の番号がファイルに保存されていますか?それは六角でますか?あなたのコードは、私には正しいようます。
バイナリデータを扱う場合には、
あなたがWindows上している場合は、バイナリモードでファイルを開いていることを確認する必要があります。これは、読み取りと書き込みの両方のために行く。
open(filename, "rb") do |file|
num = file.read(2).unpack("S")
puts num
end
また、ソース・プラットフォームに応じて、「エンディアン」のエンコードに問題があるかもしれません。例えば、古いMacシステム、IBMのPowerサーバー、PS3クラスタ、またはSun SPARCサーバを含めたPowerPCベースのマシン、。
あなたはそれが「少ない」だ方法の例を投稿することができますか?通常、データへの明白なパターンがあります。
あなたが0x1234のを望んでいますが、0x3412を取得する場合たとえば、それはエンディアン問題です。
所属していません StackOverflow