3

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

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

我在这里做错了什么?

4

6 回答 6

5

您没有读取足够的字节。正如您在对 tadman 回答的评论中所说,您得到202的不是3405691582

请注意,前 2 个字节0xCAFEBABE0xCA=202

如果您真的想要一个数字中的所有 8 个字节,那么您需要读取的不仅仅是 unsigned short

尝试

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

下划线假设本机 long 将是 8 个字节,这绝对不能保证。

于 2009-08-25T00:10:45.780 回答
4

看看《镐头》怎么样?(红宝石 1.9,第 44 页)

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

each_byte 逐字节迭代文件。

于 2010-12-05T16:37:17.940 回答
2

有几个库可以帮助解析 Ruby 中的二进制数据,通过让您在简单的高级声明性 DSL 中声明数据格式,然后通过他们自己。

我从未使用过其中之一,但这里有两个例子。(还有更多,但我不知道):

于 2009-08-25T15:02:52.477 回答
1

好的,我开始工作了:

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

感谢您所有的帮助。

于 2009-08-25T15:30:05.920 回答
0

文件中存储的数字是什么格式?是十六进制的吗?你的代码对我来说看起来是正确的。

于 2009-08-24T21:02:27.317 回答
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 这是一个字节序问题。

于 2009-08-24T21:02:30.810 回答