2017-01-31 6 views
0

unhex('6BFD3D0AFDFD4E01FDFD67703A34757F')を使用してBLOBを格納するSQLデータベースがあります。ノードバッファを使用したutf-8での文字列のシリアル化

サーバは、blobを取得し、ノードバッファに<Buffer 6b 8a 3d 0a 9b eb 4e 01 96 a6 67 70 3a 34 75 7f>と格納します。

サーバーはバッファをシリアル化し、buffer.toString()を使用してクライアントに送信します。デフォルトはutf8エンコーディングです。

クライアントが受信して、デシリアライズ<Buffer 6b ef bf bd 3d 0a ef bf bd ef bf bd 4e 01 ef bf bd ef bf bd 67 70 3a 34 75 7f>になりBuffer.from(buffer, 'utf8')を使用してバッファを、と私は.toString('hex')を使用して六角に戻ってそれを変換する場合、私は6BEFBFBD3D0AEFBFBDEFBFBD4E01EFBFBDEFBFBD67703A34757Fを取得します。私がやるのであればをそれをすべてを合計する

は、:

let startHex = "6BFD3D0AFDFD4E01FDFD67703A34757F" 
let buffer = Buffer.from(hex, 'hex') 
let endHex = Buffer.from(buffer.toString()).toString('hex').toUpperCase()) 
console.log(endHex) 

出力は次のとおりです。

​​

startHexendHex異なるが、なぜ私の質問はありますか?彼らはただ違うだけではありません。 endHexに余分な文字がある以外は同様です。 base64またはbinaryを使用してサーバーとクライアントの間でバッファーをシリアル化すると正しい出力が得られることがわかりますが、クライアントがを使用してstartHexのシリアル化されたバッファーを見つけ出すことができれば簡単です。その理由は、クライアントに送信する前に実際にbuffer.toString()を呼び出すサーバーの内部動作にアクセスできないため、エンコードを変更できないためです。

答えて

0

元の入力に無効なUTF-8文字があります。無効なUTF-8置換文字にはバイトEFBFBDが含まれており、出力で数回確認できます。

関連する問題