2017-09-07 3 views
1

J'essaie de convertir un tableau d'octets en une chaîne, puis de l'envoyer sur un socket à un serveur distant. J'ai prototypé avec succès le code dans Python et essaye de le faire migrer vers Javascript.JS vs Python byte array encoding

Pour une raison quelconque, il existe une divergence dans le dernier caractère entre les deux langues.

Python code

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) 

Je pense que cela pourrait avoir quelque chose à voir avec la différence entre ascii et UTF.

+3

Si le javascript accomplirez 'somme de contrôle (données)' au lieu de 'somme de contrôle (0xC0)'? Le python devrait-il faire 'bytearray (data + [make_checksum (data)])? – mgilson

+2

Si 'message' est un octet, vous ne devez pas le représenter avec une chaîne en JavaScript. Laissez-le comme un «Uint8Array». – Ryan

+0

est-ce qu'on parle de nœud ou de navigateur JS ici? Vous ne pouvez pas représenter un tableau d'octets comme une chaîne car tous les tableaux d'octets ne sont pas valides. – Lux

Répondre

2

Avec l'aide de @Ryan, j'ai été en mesure de résoudre le problème en utilisant un Buffer au lieu d'un tableau non signé.

code

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)]))