2017-02-18 108 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

相關問題