2017-02-18 9 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であるRubyのことを "説得" する必要がある、とだけにしてUTF-8に変換するように思えます。

+1

Ruby Stringは、エンコードされたバイト配列とエンコードタグです。 'encode'メソッドはこのエンコーディングタグに依存してエンコーディングを適切に変換します。 –

+0

確かに。ありがとう。 – user2679436

関連する問題