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

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

我在这里做错了什么?

有帮助吗?

解决方案 4

好吧,我得到它的工作:

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

感谢所有的帮助。

其他提示

你不读足够的字节。当你到tadman的答案的评论说,你得到202代替3405691582

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

如果你真的想在一个单一号码的所有8个字节,那么你需要阅读比签名更短。

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

下划线是假设的天然长将是8个字节,这绝对是不能保证。

如何寻找在镐头? (红宝石1.9,第44页)

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

each_byte迭代由字节文件字节。

有几个库可以帮助您在 Ruby 中解析二进制数据,让您在简单的高级声明性 DSL 中声明数据格式,然后通过以下方式计算出所有打包、解包、位旋转、移位和字节序转换:他们自己。

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

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

在处理二进制数据打交道,你需要确保你打开文件以二进制模式,如果你使用的是Windows。这同样适用于读取和写入两者。

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

有也可以是取决于源平台上的问题与“端”的编码。例如,基于PowerPC的机器,其中包括旧的Mac系统,IBM Power服务器,PS3集群,或Sun Sparc服务器。

你能张贴它是如何“少”的例子吗?一般有一个明显的模式向数据。

例如,如果你想为0x1234,但你得到0x3412这是一个尾数问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top