Javascript 读取字节值字符串字符
我正在尝试用JavaScript实现一个通信协议(语言强制)。由于使用了TCP/IP,因此通信是在TCP/IP中完成的 每个数据包按如下方式划分:Javascript 读取字节值字符串字符,javascript,string,byte,Javascript,String,Byte,我正在尝试用JavaScript实现一个通信协议(语言强制)。由于使用了TCP/IP,因此通信是在TCP/IP中完成的 每个数据包按如下方式划分:内容大小以大端字节+内容 因此,对于大小为28的数据包,让我们假设{“type”:“success”,“id”:0},发送的数据包将是0,0,0,28,“{','”,'t',等等。 使用这种语法,我可以用纯JavaScript发送数据包 问题是,由于WebTCP,我得到的数据包总是一个字符串,当数据包的大小在128到255之间时(我猜,我只知道它大于1
内容大小以大端字节+内容
因此,对于大小为28的数据包,让我们假设{“type”:“success”,“id”:0}
,发送的数据包将是0,0,0,28,“{','”,'t',等等。
使用这种语法,我可以用纯JavaScript发送数据包
问题是,由于WebTCP,我得到的数据包总是一个字符串,当数据包的大小在128到255之间时(我猜,我只知道它大于128),读错了。我想我知道问题出在哪里:
这是我提取数据的函数
function extractData() {
// return empty string if not enough bytes to read the size of next packet
if (!buffer || buffer.length < 4) { return ""; }
// read size
var size = [];
for (var idx = 0 ; idx < 4 ; ++idx) {
size.push(buffer.charCodeAt(idx)); // pretty sure the problem comes from here.
}
// size from big endian to machine endian
size = ntohl(size);
// return empty string if the buffer does not have the complete packet yet
if (buffer.length < 4 + size) { return ""; }
// copy the packet content into ret
var ret = "";
for (var idx = 4 ; idx < size + 4 ; ++idx) {
ret += buffer[idx];
}
// the buffer removes the packet returned
buffer = buffer.substring(size + 4);
// return the packet content
return ret;
}
函数提取数据(){
//如果没有足够的字节读取下一个数据包的大小,则返回空字符串
如果(!buffer | | buffer.length<4){return”“;}
//读取大小
变量大小=[];
对于(变量idx=0;idx<4;++idx){
size.push(buffer.charCodeAt(idx));//很确定问题来自这里。
}
//从大端到机器端的大小
尺寸=ntohl(尺寸);
//如果缓冲区还没有完整的数据包,则返回空字符串
如果(buffer.length<4+大小){return”“;}
//将数据包内容复制到ret中
var ret=“”;
对于(变量idx=4;idx
buffer
是一个全局变量,每次接收数据时都会填充该变量。
ntohl
是我从中获得的一个函数(没有I
偏移量),它接受一个4字节数组并返回一个整数
因此,出现故障的行是size.push(buffer.charCodeAt(idx));
,我猜当给定的字符代码大于ASCII值(0-127)时,charCodeAt
函数溢出,发送的大小是130,在JavaScript端,size
数组包含[0,0,0,65533]
(或者类似的,我不记得正确的数字。如果大小为30,我得到[0,0,0,30]
,所以我知道这应该是可行的
我有几个问题:
谢谢。根据ntohl的定义,它不包括整数和数组
exports.ntohl = function(b, i) {
return ((0xff & b[i + 0]) << 24) |
((0xff & b[i + 1]) << 16) |
((0xff & b[i + 2]) << 8) |
((0xff & b[i + 3]));
}
exports.ntohl=函数(b,i){
返回((0xff&b[i+0])谢谢,但是charCodeAt
正是我不想使用的,因为当值大于127时它会溢出。请看,它可以处理高达65536的值,但重要的是如何准确地传输您的字符。在到达charCodeAt之前,可能会在其他点将输出转换为纯ascii。谢谢,我会检查ev我得到的每一步。似乎都是同样的问题,而在我的情况下,我不关心“utf-8”,我只想要uchar值。我编辑函数是为了不让I
偏移(只是b[0]
,b[1]
等等)。你得到的数据包大小是多少?使用charCodeAt
后,我有一个类似[0,0,30]
的数组,使用ntohl后,我得到30。但在服务器端,我发送类似[0,0,0130]
的内容,我读取[0,0,065533]
使用charCodeAt
。接收到的数据可能是错误的,因为它通过WebTCP传输。同时请记住,低阶位位于数组的顶部。