我正在尝试从文件中读取无符号整数(存储为连续字节)并将它们转换为整数。我试过这个:
file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value will be less than expected
我在这里做错了什么?
您没有读取足够的字节。正如您在对 tadman 回答的评论中所说,您得到202
的不是3405691582
请注意,前 2 个字节0xCAFEBABE
是0xCA
=202
如果您真的想要一个数字中的所有 8 个字节,那么您需要读取的不仅仅是 unsigned short
尝试
num = file.read(8).unpack("L_")
下划线假设本机 long 将是 8 个字节,这绝对不能保证。
看看《镐头》怎么样?(红宝石 1.9,第 44 页)
File.open("testfile")
do |file|
file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end
each_byte 逐字节迭代文件。
好的,我开始工作了:
num = file.read(8).unpack("N")
感谢您所有的帮助。
文件中存储的数字是什么格式?是十六进制的吗?你的代码对我来说看起来是正确的。
处理二进制数据时,如果您在 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 这是一个字节序问题。