Я могу ошибаться здесь. Но насколько я помню, символы юникода могут быть между 2-4 байтами. Когда вы передаете свои двоичные данные в виде текста на клиентскую сторону, вы рискуете испортить эту информацию, потому что клиент будет интерпретировать их как Unicode.
Если бы я преобразовал этот текст в blob на стороне клиента:
var b = new Blob(['x���'],{type:"application/octet-stream"});
b.size; //10
Как видите, я получаю 10 байт, что неверно, должно было быть 4.
Вы можете передавать данные напрямую в виде двоичной строки, поскольку вы используете Node, на на стороне сервера:
function createBuffer(v){
var b = new ArrayBuffer(4),
vw = new DataView(b);
vw.setInt32(0,v);
return b;
}
Это создаст ваш буфер, теперь вы не можете просто отправить его как есть клиенту, либо представить его как json, либо напрямую как двоичную строку. Чтобы представить его как двоичный, вам не нужна вышеуказанная функция, вы могли бы сделать:
("0".repeat(32) + (2024000250).toString(2)).slice(-32); //"01111000101000111100101011111010"
Если хотите json, вы можете сделать:
function convertBuffToBinaryStr(buff){
var res = [],
l = buff.byteLength,
v = new DataView(buff);
for (var i = 0; i < l; ++i){
res.push(v.getUint8(i));
}
return JSON.stringify(res);
}
Теперь попробуйте видя, что это выводит:
convertBuffToBinaryStr(createBuffer(2024000250)); //"[120,163,202,250]"
На стороне клиента вы должны интерпретировать это:
function interpret(json){
json = JSON.parse(json);
return parseInt(json.map((d)=>("0".repeat(8) + d.toString(2)).slice(-8)).join(""),2);
}
Теперь попробуйте:
interpret("[120,163,202,250]"); //2024000250
Примечание: для ваша функция интерпретации, вы должны использовать dataView для setUint8 и использовать getInt32 в конце, поскольку вы используете целые числа со знаком, выше не будет работать для всех случаев.