Ruby解包为多个8位地址的十六进制表示?

Ruby解包为多个8位地址的十六进制表示?,ruby,unpack,Ruby,Unpack,我正在读取一个文件,它看起来像: 0025be60 24 b3 10 80 00 b4 10 80 a4 b4 10 80 08 b5 10 80 |$...............| 0025be70 94 b5 10 80 9c b7 10 80 40 b9 10 80 e4 b9 10 80 |........@.......| 0025be80 e0 bf 10 80 94 c0 10 80 f4 cc 10 80 54 cd 10 80 |............T.

我正在读取一个文件,它看起来像:

0025be60  24 b3 10 80 00 b4 10 80  a4 b4 10 80 08 b5 10 80  |$...............|
0025be70  94 b5 10 80 9c b7 10 80  40 b9 10 80 e4 b9 10 80  |........@.......|
0025be80  e0 bf 10 80 94 c0 10 80  f4 cc 10 80 54 cd 10 80  |............T...|
0025be90  44 d9 10 80 88 d9 10 80  30 da 10 80 88 db 10 80  |D.......0.......|
0025bea0  44 dc 10 80 d0 e3 10 80  6c e6 10 80 d0 e8 10 80  |D.......l.......|
但是我很难将它转换成一系列十六进制值。我希望:

x = [0x24b31080, 0x00b41080, 0xa4b41080, 0x08b51080 ...

但是我有个问题。我认为file_contents.unpack(“H8*)可以工作,但它只返回第一个值…任何解包专家都可以吗?

您必须对数据进行更多的转换。一种方法是在输入流上使用
gsub
来删除空格。如下所示:

lines.collect do |line|
  line.gsub(/ /, '').unpack('H8H8H8')
end
如果要忽略该行的一部分,则始终可以更好地确定其范围:

lines.collect do |line|
  line[10, 48].gsub(/ /, '').unpack('H8H8')
end.flatten

这是从字符串的偏移量10开始提取48个字符,并将其解包。最后的
展平将把两级数组结构转换为一级。

您必须对数据进行更多的转换。一种方法是在输入流上使用
gsub
来删除空格。如图所示关于:

lines.collect do |line|
  line.gsub(/ /, '').unpack('H8H8H8')
end
如果要忽略该行的一部分,则始终可以更好地确定其范围:

lines.collect do |line|
  line[10, 48].gsub(/ /, '').unpack('H8H8')
end.flatten

这是从字符串中的偏移量10开始提取48个字符,并将其解包。最后的
展平将把两级数组结构转换为一级。

不会
删除(“”)
在这种情况下比
gsub
容易吗?我的错误。上面显示的是十六进制编辑器中的文件内容……我只需打开文件并调用.read即可很好地读取文件。真正的问题是如何获取文件的全部内容(在.read之后)这是一个完全不同的问题。你想要的是
数据。解包('N*)
,它可以提取你的数字。如果32位整数不是正确的endian类型,你可能需要尝试其他方法来打包,但它们是。不会
删除(“”)
在这种情况下比
gsub
容易吗?我的错误。上面显示的是十六进制编辑器中的文件内容……我只需打开文件并调用.read即可很好地读取文件。真正的问题是如何获取文件的全部内容(在.read之后)这是一个完全不同的问题。你需要的是
数据。解包('N*)
,它可以提取你的数字。如果32位整数不是正确的endian类型,你可能需要尝试其他打包方法,但它们是正确的。