字符串包含 NUL 字节
String contains NUL bytes
我正在尝试将 IBM437
中的这个文件解码为可读 UTF
=13=] 其中字符串包含 nul
字节,我知道如何 gsub
出 nul
字节使用:
.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*')
:
file.scan(/......../)
在这里,我们将庞大的 0 和 1 字符串(文件)分解为一个字符串数组,每个字符串包含 8 个字符。看起来像这样:['00001111', '11110000', ...].
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, ...]
.
的数组
arr.pack('U*')
从第 2 步开始,我们有一个整数数组,代表每个字符。我们现在可以使用 pack 方法将我们的整数数组转换为字符串。我们用于 pack 的参数是 U 来告诉他这些整数实际上是 UTF-8 字符。
我正在尝试将 IBM437
中的这个文件解码为可读 UTF
=13=] 其中字符串包含 nul
字节,我知道如何 gsub
出 nul
字节使用:
.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*')
:
file.scan(/......../)
在这里,我们将庞大的 0 和 1 字符串(文件)分解为一个字符串数组,每个字符串包含 8 个字符。看起来像这样:['00001111', '11110000', ...].
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, ...]
.
arr.pack('U*')
从第 2 步开始,我们有一个整数数组,代表每个字符。我们现在可以使用 pack 方法将我们的整数数组转换为字符串。我们用于 pack 的参数是 U 来告诉他这些整数实际上是 UTF-8 字符。