繁体   English   中英

Ruby相当于Node .toString('ascii')

Ruby equivalent of Node .toString('ascii')

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在努力将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 = ???

我已经尝试了服务器方面的事情,实际上是所有解压缩选项,并且也尝试使用了编码功能,但是我对这里存在的问题缺乏了解。

1 个回复

好的,我对Node.js并不熟悉,但是您可以从一些基本的了解中获得相当的了解:

节点状态:

'ascii'-仅适用于7位ASCII数据。 这种编码速度很快,如果置位,它将去除高位。

更新在重读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(如果我们剥离高位,则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'时也忽略了Delete(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,并将replace: ''添加到一无所有。

1 相当于ActiveRecord'where'的Ruby

我有一个数组,我想按:city进行过滤。 使用ActiveRecord查询将是这样的: 如何仅使用纯Ruby过滤没有ActiveRecord方法的数组? ...

2 相当于Ruby'is_a?'的Python

我想知道是否有一个与Ruby的“ is_a”等效的Python? 方法? 信息: 如果class是obj的类,或者class是obj的超类之一或obj中包含的模块,则返回true。 谢谢。 ...

4 有没有Python相当于Ruby的'any?' 功能?

在Ruby中,你可以调用Enumerable#any吗? 在一个可枚举的对象上查看它的任何元素是否满足你在块中传递的谓词。 像这样: 在Python中,有一个any ,做类似的事情,但布尔值的列表功能。 当然,对于一个合理大小的列表,我只是这样做: 但是,如果我的列表很 ...

7 相当于Ruby

我正在用Ruby实现Java库。 我遇到了以下路障。 是否可以在ruby中实现以下代码? 字节[],IvParameterSpec,SecretKeySpec有红宝石等效物吗? ...

2010-08-27 23:57:19 1 488   java/ ruby
8 Ruby相当于“哪个”

ruby可以查找bash或gnu makefile中的二进制文件的查找路径吗? Makefile文件 庆典 回答感谢Senthess 红宝石 需要一些代码清理 用法 实际上,每个返回一行。 这将返回一个数组而不是一个字符串,也许更好,也许没有。 ...

2011-07-08 12:23:39 1 326   ruby
9 Matlab的toString相当于?

有什么办法可以将任何对象转换为Matlab中的字符串表示形式? 我试过了 但有时它会生成这样的HTML代码 结果是否只能得到纯文本? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM