gpt4 book ai didi

node.js - Ruby 相当于 Node .toString ('ascii' )

转载 作者:太空宇宙 更新时间:2023-11-03 23:17:44 24 4
gpt4 key购买 nike

我正在努力将 Node 应用程序转换为 Ruby。我有一个整数缓冲区,需要将其编码为 ASCII 字符串。

在 Node 中,这是这样完成的:

const a = Buffer([53, 127, 241, 120, 57, 136, 112, 210, 162, 200, 111, 132, 46, 146, 210, 62, 133, 88, 80, 97, 58, 139, 234, 252, 246, 19, 191, 84, 30, 126, 248, 76])
const b = a.toString('hex')
// b = "357ff178398870d2a2c86f842e92d23e855850613a8beafcf613bf541e7ef84c"
const c = a.toString('ascii')
// c = '5qx9\bpR"Ho\u0004.\u0012R>\u0005XPa:\u000bj|v\u0013?T\u001e~xL'

我想在 Ruby 中获得相同的输出,但我不知道如何将 a 转换为 c。我使用 b 来验证 a 在 Ruby 和 Node 中的解析方式是否相同,并且看起来正常工作。

a = [53, 127, 241, 120, 57, 136, 112, 210, 162, 200, 111, 132, 46, 146, 210, 62, 133, 88, 80, 97, 58, 139, 234, 252, 246, 19, 191, 84, 30, 126, 248, 76].pack('C*')
b = a.unpack('H*')
# ["357ff178398870d2a2c86f842e92d23e855850613a8beafcf613bf541e7ef84c"]
# c = ???

我已经尝试了几种方法,几乎​​所有的解包选项,我也尝试使用编码功能,但我不明白这里的问题是什么。

最佳答案

好吧,我对 Node.js 不太熟悉,但你可以相当接近一些基本的理解:

Node 状态:

'ascii' - For 7-bit ASCII data only. This encoding is fast and will strip the high bit if set.

更新重新阅读 nod.js 描述后,我认为这只是意味着它将下降 127 并且仅关注前 7 位,因此可以简化为:

def node_js_ascii(bytes) 
bytes.map {|b| b % 128 }
.reject(&127.method(:==))
.pack('C*')
.encode(Encoding::UTF_8)
end
node_js_ascii(a)
#=> #=> "5qx9\bpR\"Ho\u0004.\u0012R>\u0005XPa:\vj|v\u0013?T\u001E~xL"

现在唯一的区别是,node.js 使用“\u000b”来表示垂直制表符,而 ruby​​ 使用“\v”,而 ruby​​ 使用大写字符表示 unicode 而不是小写(“\u001E”与“\u001e”)(如果您选择的话,您可以处理这个问题)

请注意由于字节数组中的字符大于 8 位,因此这种形式的编码是不可逆的。

TL;DR(之前的解释和解决方案仅适用于 8 位)

好吧,我们知道最大支持的十进制是 127 ("1111111".to_i(2)),如果设置意味着 [我假设] 241,该 Node 将去除高位(如果我们去除高位,8 位数字将变成 113)

有了这种理解,我们就可以使用:

a = [53, 127, 241, 120, 57, 136, 112, 210, 162, 200, 111, 132, 46, 146, 210, 62, 133, 88, 80, 97, 58, 139, 234, 252, 246, 19, 191, 84, 30, 126, 248, 76].map do |b| 
b < 128 ? b : b - 128
end.pack('C*')
#=> "5\x7Fqx9\bpR\"Ho\x04.\x12R>\x05XPa:\vj|v\x13?T\x1E~xL"

然后我们可以将其编码为 UTF-8,如下所示:

a.encode(Encoding::UTF_8)
#=> "5\u007Fqx9\bpR\"Ho\u0004.\u0012R>\u0005XPa:\vj|v\u0013?T\u001E~xL"

但是这里仍然存在一个问题。

看起来 Node.js 在转换为“ascii”时也会忽略删除(127)(我的意思是设置了高位,但如果我们剥离它,那么它就是 63(“?”),与输出不匹配),所以我们也可以解决这个问题

 a = [53, 127, 241, 120, 57, 136, 112, 210, 162, 200, 111, 132, 46, 146, 210, 62, 133, 88, 80, 97, 58, 139, 234, 252, 246, 19, 191, 84, 30, 126, 248, 76].map do |b| 
b < 127 ? b : b - 128
end.pack('C*')
#=> "5\xFFqx9\bpR\"Ho\x04.\x12R>\x05XPa:\vj|v\x13?T\x1E~xL"
a.encode(Encoding::UTF_8, undef: :replace, replace: '')
#=> "5qx9\bpR\"Ho\u0004.\u0012R>\u0005XPa:\vj|v\u0013?T\u001E~xL"

现在,由于 127 - 128 = -1(负符号位)在 UTF-8 中变成了“\xFF”,这是一个未定义的字符,因此我们添加 undef: :replace 当字符未定义时要做什么使用替换,并且我们添加 replace: '' 来替换任何内容。

关于node.js - Ruby 相当于 Node .toString ('ascii' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306350/

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