2017-02-18 107 views
0

我有一个Base64编码的数据包捕获二进制文件。 我想提取一个子串在捕获的某个位置。如何正确地将UTF-16LE字符的字节数组转换为Ruby中的utf-8字符串

我在Ruby中这样做:

payload_decoded = Base64.decode64(payload) 
file_size = payload_decoded[114..115].unpack('S*')[0] 
file_fullpath = payload_decoded[124, file_size] 
p file_fullpath 

此作品在一定程度上。 file_size获得一个我想要提取的长度的整数。然后我可以提取字节数组的正确部分。如果我只是在我的Mac终端中测试它,它会完美地显示字符串。

但是,此应用程序本身的代码在CentOS7中运行时,所有字符都显示为00字节后缀(例如,T显示为T \ x00)。我想我可以从字符串中删除,但想避免这种情况。什么是最正确的方法来处理这个问题?

TIA

+1

通常['String#encode'](https://ruby-doc.org/core-2.4.0/String.html#method-i-encode)是一个很好的开始。 – tadman

+0

谢谢,我确实尝试使用编码。但它之前缺少了force_encoding。让我更困惑的是,在Mac终端上,我不需要那些额外的步骤。 – user2679436

回答

1

这似乎得到期望的结果:

file_fullpath = file_fullpath.force_encoding('UTF-16LE').encode!('UTF-8') 

好像我首先需要“说服”红宝石该字符串是UTF-16LE,然后才转换为UTF-8 。

+1

Ruby String是一个编码的字节数组加上一个编码标记。 'encode'方法依赖于这个编码标签来正确地转换编码。 –

+0

确实。谢谢。 – user2679436

相关问题