我正在尝试从文件中读取无符号整数(存储为连续字节)并将它们转换为整数。我试过这个:
file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value will be less than expected
我在这里做错了什么?
答案 0 :(得分:5)
你没有读足够的字节数。正如你在对tadman的回答的评论中所说,你得202
而不是3405691582
请注意0xCAFEBABE
的前2个字节是0xCA
= 202
如果你真的想要一个数字中的所有8个字节,那么你需要阅读超过unsigned short
试
num = file.read(8).unpack("L_")
下划线假设本机long将是8个字节,绝对不能保证。
答案 1 :(得分:4)
看着镐头怎么样? (Ruby 1.9,p.44)
File.open("testfile")
do |file|
file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end
each_byte逐字节遍历文件。
答案 2 :(得分:2)
有一些库可以帮助解析Ruby中的二进制数据,让你在一个简单的高级声明性DSL中声明数据格式,然后找出所有打包,解包,bit-twiddling,shift和endian - 他们自己的转换。
我从未使用过其中的一个,但这里有两个例子。 (还有更多,但我不知道):
答案 3 :(得分:1)
好的,我让它上班了:
num = file.read(8).unpack("N")
感谢您的所有帮助。
答案 4 :(得分:0)
文件中存储的数字是什么格式?它是十六进制的吗?你的代码对我来说是正确的。
答案 5 :(得分:0)
处理二进制数据时,如果您使用的是Windows,则需要确保以二进制模式打开文件。这适用于阅读和写作。
open(filename, "rb") do |file|
num = file.read(2).unpack("S")
puts num
end
“endian”编码可能还存在问题,具体取决于源平台。例如,基于PowerPC的计算机,包括旧Mac系统,IBM Power服务器,PS3集群或Sun Sparc服务器。
你能发一个如何“少”的例子吗?通常情况下,数据有明显的模式。
例如,如果你想要0x1234但是你得到0x3412则是一个字节序问题。