Ruby - 从文件中读取字节,转换为整数

时间:2009-08-24 20:43:49

标签: ruby file unsigned

我正在尝试从文件中读取无符号整数(存储为连续字节)并将它们转换为整数。我试过这个:

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

我在这里做错了什么?

6 个答案:

答案 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则是一个字节序问题。