字符串包含 NUL 字节

String contains NUL bytes

我正在尝试将 IBM437 中的这个文件解码为可读 UTF =13=] 其中字符串包含 nul 字节,我知道如何 gsubnul 字节使用: .gsub("\u0000", '') 但是我不知道从哪里 gsub 输出字节。

来源如下:

def gather_info
  file = './lib/SETI_message.txt'
  File.read(file).each_line do |gather|
    packed = [gather].pack('b*')
    ec = Encoding::Converter.new(packed, 'utf-8')
    encoding_forced = packed.encode(ec)
    File.open('packed.txt', 'a+'){ |s| s.puts(encoding_forced.gsub("\u0000", '')) }
  end
end

gather_info

这是 file

谁能告诉我我做错了什么?

以下对我有效:

file = File.read('SETI.txt')
packed = file.scan(/......../).map{|s| s.to_i(2)}.pack('U*')
File.write('packed.txt', packed)

让我们分解 file.scan(/......../).map{|s| s.to_i(2)}.pack('U*') :

  1. file.scan(/......../)

在这里,我们将庞大的 0 和 1 字符串(文件)分解为一个字符串数组,每个字符串包含 8 个字符。看起来像这样:['00001111', '11110000', ...].

  1. arr.map{|s| s.to_i(2)}

从第 1 步我们得到了一个字符串数组,用二进制表示法表示不同的字符。我们可以通过应用 s.to_i(2) 来转换其中一个字符串(称为 s),因为参数“2”告诉方法 to_i 使用基数 2。所以 '00000011'.to_i(2) returns3.

我们使用 map 将其应用于所有字符。 所以我们现在有一个看起来像 [98, 82, 49, 39, ...].

的数组
  1. arr.pack('U*')

从第 2 步开始,我们有一个整数数组,代表每个字符。我们现在可以使用 pack 方法将我们的整数数组转换为字符串。我们用于 pack 的参数是 U 来告诉他这些整数实际上是 UTF-8 字符。