2013-12-10 2 views
3

Я пытаюсь отправить двоичные данные в экспресс-приложение. Он отлично работает, если мои значения меньше 0x80. Если одно значение равно 0x80 или больше, оно заполняет весь буфер.nodejs/express и двоичные данные в POST

Экспресс Обработчик:

binary = require('binary'); 

exports.api = function(req, res){ 
    var body = req.body.name; 
    var buf = new Buffer(body,'binary'); 

    console.log('body',req.body); 
    console.log('req body len', body.length); 
    console.log('buf len', buf.length); 

    var g = binary.parse(buf) 
     .word16bu('a') // unsigned 16-bit big-endian value 
     .word16bu('b').vars 

    console.log('g.a', g.a); 
    console.log('g.b', g.b); 

    res.send("respond with a resource"); 
}; 

Python клиент (Content-Type: применение/х-WWW-форм-urlencoded):

import requests 
from struct import pack 
# send two unsigned shorts (16-bits each). 
requests.post('http://localhost:3000/api', data={'name':pack('!HH',1,2)}) 

Экспресс выход, когда данные = 1,2. Это то, что я ожидал бы.

body { name: '\u0000\u0001\u0000\u0002' } 
req body len 4 
buf len 4 
g.a 1 
g.b 2 
POST /api 200 1ms - 23b 

Экспресс-выход, когда данные = 1,0xFF. Интересно отметить, что 9520 фактически равен 0x25 0x30 в гексагоне, что соответствует «% 0» в ASCII. Да, он, похоже, разбирает строку «% 00% 01 ...». Хотел бы я знать, как это предотвратить!

body { name: '%00%01%00%FF' } 
req body len 12 
buf len 12 
g.a 9520 
g.b 12325 
POST /api 200 2ms - 23b 

ответ

3

Оказалось, что это проблема с кодировкой. Кажется, что все по умолчанию имеет значение «utf8», но в этом случае его нужно установить в «двоичный».

Например:

var buf = new Buffer(body.toString('binary'),'binary'); 

Не менее важно, что мне нужно, чтобы установить кодировку nodejs многопартийной парсера к «двоичный». См .: https://github.com/superjoe30/node-multiparty/issues/37

Смежные вопросы