Ruby通过保持十六进制值将十六进制字符串写入二进制文件

时间:2017-12-12 23:31:23

标签: ruby-on-rails ruby

我想在Ruby中生成随机字节,但我还想在随机字节的特定位置插入一些常量值。

random_hex_string = SecureRandom.hex (length)
random_hex_string.insert(0,"0102")
random_hex_string.insert(30*1,"36")

所以我生成随机十六进制字节并在那里插入我的十六进制值。问题是我现在有一个字符串而不是字节数组。所以当我打印它时:

File.open("file.txt", 'w+b') do |f|
f.write(random_hex_string)

它 - 毫不奇怪 - 将十六进制字符串转换为二进制,然后写入。所以我的十六进制值没有保留。更清楚的是,当我将十六进制字符串写入文件时,然后我想在十六进制转储文件时看到相同的十六进制值。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以将其转换为单个元素数组,并将其pack转换为十六进制数组。例如,当我运行你的代码时:

require 'securerandom'

length = 2 ** 6
random_hex_string = SecureRandom.hex (length)
random_hex_string.insert(0,"0102")
random_hex_string.insert(30*1,"36")

puts random_hex_string
File.open("file.txt", 'w+b') do |file|
  file.write([random_hex_string].pack('H*')) # see also 'h'
end

我得到了输出

  

010299e84e9e4541d08cb800462b6f36a87ff118d6291368e96e8907598a2dfd4090658fea1dab6ed460ab512ddc54522329f6b4ddd287e4302ef603ce60e85e631591

然后运行

$ hexdump  file.txt 
0000000 01 02 99 e8 4e 9e 45 41 d0 8c b8 00 46 2b 6f 36
0000010 a8 7f f1 18 d6 29 13 68 e9 6e 89 07 59 8a 2d fd
0000020 40 90 65 8f ea 1d ab 6e d4 60 ab 51 2d dc 54 52
0000030 23 29 f6 b4 dd d2 87 e4 30 2e f6 03 ce 60 e8 5e
0000040 63 15 91                                       
0000043

除非我错了,否则它与脚本的输出完全匹配。

之前我从来没有搞过Array#pack,并且没有用hex做过多,但这似乎是给出了你需要的结果,所以应该至少朝着正确的方向迈出一步。

答案 1 :(得分:1)

为什么在你不想要十六进制时要求十六进制?就这样做:

random_bytes = SecureRandom.random_bytes(length)
random_bytes.insert(0, "\x01\x02")
random_bytes.insert(15, "\x36")