2017-09-07 7 views
1

バイト配列を文字列に変換し、それをソケット経由でリモートサーバーに送信しようとしています。私はPythonでコードのプロトタイプ作成に成功し、Javascriptに移行しようとしています。JS対Pythonのバイト配列のエンコーディング

何らかの理由で、2つの言語の間に最後の文字に矛盾があります。

Pythonのコード

def make_checksum(data): 
    num = 0x00 
    for num2 in data: 
     num = (num + num2) & 0xFF 
    return num 

data = [0x56, 0x54, 0x55, 0x3E, 0x28, 0x00, 0x08, 
     0x00, 0x03, 0x01, 0x46, 0x00, 0x00, 0x00, 0xC0] 
message = bytearray(data + [make_checksum(data)]) 

Javascriptを

function checksum(data) { 
    let res = 0x00 
    for (let i = 0; i < data.length; ++i) { 
     res = (res + data[i]) & 0xFF 
    } 
    return String.fromCharCode(res) 
} 

let data = new Int8Array([0x56, 0x54, 0x55, 0x3E, 0x28, 0x00, 
      0x08, 0x00, 0x03, 0x01, 0x46, 0x00, 0x00, 0x00, 0xC0]) 
let message = String.fromCharCode(...data) + checksum(data) 

私は、これはアスキーUTFの違いとは何かを持っているかもしれないと思います。

+3

にはJavaScriptを代わりに ''チェックサム(0xC0の) ''のチェックサム(データを)やるべき? Pythonが 'bytearray(data + [make_checksum(data)])'を実行すべきか? – mgilson

+2

'message'がバイトの場合は、JavaScriptで文字列で表現しないでください。 'Uint8Array'のままにしておきます。 – Ryan

+0

ここでノードについて、またはブラウザJSについて話しますか?すべてのバイト配列が有効なユニコードではないため、バイト配列を文字列として表すことはできません。 – Lux

答えて

2

@Ryanの助けを借りて、私は符号なし配列の代わりにBufferを使用して問題を解決することができました。

コード

function checksum(data) { 
    let res = 0x00 
    for (let i = 0; i < data.length; ++i) { 
     res = (res + data[i]) & 0xFF 
    } 
    return Buffer.from([res]) 
} 

let data = Buffer.from([0x56, 0x54, 0x55, 0x3E, 0x28, 0x00, 
        0x08, 0x00, 0x03, 0x01, 0x4F, 0x00, 0x00, 0x00]) 
console.log(Buffer.concat([data, checksum(data)])) 
関連する問題