Javascript 读取字节值字符串字符

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

我正在尝试用JavaScript实现一个通信协议(语言强制)。由于使用了TCP/IP,因此通信是在TCP/IP中完成的

每个数据包按如下方式划分:
内容大小以大端字节+内容

因此,对于大小为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]
,所以我知道这应该是可行的

我有几个问题:

  • 如何提取字符串中字符的原始整数值
  • 是否有一种简单的方法可以将前4个字节转换为类似bytearray的内容?仅使用JS和jQuery

  • 谢谢。

    根据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传输。同时请记住,低阶位位于数组的顶部。