gpt4 book ai didi

ruby - 字符串包含 NUL 字节

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:16 25 4
gpt4 key购买 nike

我正在尝试将 IBM437 中的这个文件解码为可读的 UTF我收到一个 ArgumentError,其中字符串包含 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*') 向下:

  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) 返回 3。

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

  1. arr.pack('U*')

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

关于ruby - 字符串包含 NUL 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37261651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com