Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从javascript中设置符号位的字符串中提取二进制数据_Javascript_Node.js - Fatal编程技术网

从javascript中设置符号位的字符串中提取二进制数据

从javascript中设置符号位的字符串中提取二进制数据,javascript,node.js,Javascript,Node.js,我有一根像这样的线“��是一些测试文本“ 前2个字节是字符串其余部分的长度(这是无法更改的传统网络流量) 当二进制数据中没有设置符号位时,它解码正常,但如果设置了符号位,我就得到垃圾 下面是一个小测试程序: var decode = ''; //decode = new Buffer('ffff', 'hex'); //decode = new Buffer('85ff', 'hex'); decode = new Buffer('364e', 'hex'); //decode = new B

我有一根像这样的线“��是一些测试文本“

前2个字节是字符串其余部分的长度(这是无法更改的传统网络流量)

当二进制数据中没有设置符号位时,它解码正常,但如果设置了符号位,我就得到垃圾

下面是一个小测试程序:

var decode = '';

//decode = new Buffer('ffff', 'hex');
//decode = new Buffer('85ff', 'hex');
decode = new Buffer('364e', 'hex');
//decode = new Buffer('7f5a', 'hex');
//decode = new Buffer('00ff', 'hex');

decode += '<this>is some test text</this>';
console.log(decode);

var testbuf = decode.slice(0,2);
console.log('testbuf =' + testbuf);

var myLength1 = decode.slice(0,1).charCodeAt('hex').toString(16);
console.log('ml1 ' + myLength1.toString());

var myLength2 = decode.slice(1,2).charCodeAt('hex').toString(16);
console.log('ml2 ' + myLength2.toString());

var myLength = myLength1 + myLength2;
console.log('mylength =' + myLength1 + myLength2);

 var foo2 = parseInt(myLength, 16);
 console.log('ml3 ' + foo2.toString());
var decode='';
//解码=新缓冲区('ffff','hex');
//解码=新缓冲区('85ff','hex');
解码=新缓冲区('364e','hex');
//解码=新缓冲区('7f5a','hex');
//解码=新缓冲区('00ff','hex');
解码+='是一些测试文本';
控制台日志(解码);
var testbuf=解码切片(0,2);
log('testbuf='+testbuf);
var myLength1=decode.slice(0,1).charCodeAt('hex').toString(16);
log('ml1'+myLength1.toString());
var myLength2=decode.slice(1,2).charCodeAt('hex').toString(16);
log('ml2'+myLength2.toString());
var myLength=myLength1+myLength2;
log('mylength='+myLength1+myLength2);
var foo2=parseInt(myLength,16);
log('ml3'+foo2.toString());
使用输出上面的代码如下所示

 node foo.js
 6N<this>is some test text</this>
 testbuf =6N
 ml1 36
 ml2 4e
 mylength =364e
 ml3 13902
node foo.js
6Nis一些测试文本
testbuf=6N
ml1 36
ml2 4e
mylength=364e
ml3 13902
当没有设置符号位时,答案是正确的,但是如果数据包含一个高位集的值,那么对于具有高位集(替换字符)的每个字符,我将使用fffd结束

这是高阶位数据的输出(使用上面的0x85ff数据行):

node foo.js
��这是一些测试文本
testbuf=��
ml1 fffd
ml2 fffd
mylength=fffdfffd
ml3 4294836221
我知道这是因为charCodeAt()函数希望返回'fffd'作为它认为非ascii的替换字符,问题是,从字符串中提取二进制数据的替代方法是什么

谢谢

 node foo.js
 ��<this>is some test text</this>
 testbuf =��
 ml1 fffd
 ml2 fffd
 mylength =fffdfffd
 ml3 4294836221