如何将arraybuffer转换为字符串

 姿萱俊达俊宏 发布于 2022-12-13 06:30

我在node.js上编写了一个简单的TCP服务器,将一些数据发送到Chrome应用程序.在chrome应用程序中,当我获取数据时,我使用下面的函数将其转换为字符串,我得到一个异常" Uint16Array的字节长度应该是2的倍数 "

String.fromCharCode.apply(null, new Uint16Array(buffer))

我找不到任何可能导致此问题以及如何解决此问题的信息.任何关于此的指示都非常感谢.

以下是node.js服务器中用于将数据发送到客户端的代码:

socket.on('data', function(data) {

    console.log('DATA ' + socket.remoteAddress + ': ' + data);
    // Write the data back to the socket, 
    //   the client will receive it as data from the server
    var r= socket.write('from server\r\n');

});

以下是chrome app的代码:

  chrome.sockets.tcp.onReceive.addListener(function (info) {
            console.log('onListener registered');
            if (info.socketId != socketid)
                return;
            else {
                try {

                   data = ab2str(info.data);
                    console.log(data);
                }
                catch (e) {
                    console.log(e);
                }

            }
            // info.data is an arrayBuffer.
        });

 function ab2str(buf) {
    return String.fromCharCode.apply(null, new Uint16Array(buf));
}

Ian Clelland.. 8

您可能会看到这个问题,因为您的应用程序在套接字上收到了奇数个字节,但您正在尝试从中创建一个2字节宽的项目数组(因为这适合于a Uint16Array)

如果您的应用程序"Hello"通过网络收到字符串(5个字节),那么您可以将其转换为a Uint8Array,它将如下所示:

Item:        0   1   2   3   4
Char:        H   e   l   l   o
Uint8 Value: 72  101 108 108 111

把它投射到一个Uint16Array,虽然会尝试这样做:

Item   0     1     2
Chars  He    ll    o?
IntVal 25928 27756 ?????

如果没有第6个字节可以使用,它就无法构造数组,因此会出现异常.

Uint16Array如果您期望套接字上的UCS-2字符串数据,则仅对数据使用a 才有意义.如果您正在接收纯ASCII数据,那么您希望将其转换为Uint8Array替代,并String.fromCharCode在其上进行映射.如果它是其他东西,例如UTF-8,那么你将不得不做一些其他的转换.

但是,无论如何,套接字层总是可以自由地以任意长度的块发送数据.您的应用程序必须处理奇怪的大小,并保存您不能立即处理的任何剩余部分,以便您在收到下一个数据块时可以使用它.

1 个回答
  • 您可能会看到这个问题,因为您的应用程序在套接字上收到了奇数个字节,但您正在尝试从中创建一个2字节宽的项目数组(因为这适合于a Uint16Array)

    如果您的应用程序"Hello"通过网络收到字符串(5个字节),那么您可以将其转换为a Uint8Array,它将如下所示:

    Item:        0   1   2   3   4
    Char:        H   e   l   l   o
    Uint8 Value: 72  101 108 108 111
    

    把它投射到一个Uint16Array,虽然会尝试这样做:

    Item   0     1     2
    Chars  He    ll    o?
    IntVal 25928 27756 ?????
    

    如果没有第6个字节可以使用,它就无法构造数组,因此会出现异常.

    Uint16Array如果您期望套接字上的UCS-2字符串数据,则仅对数据使用a 才有意义.如果您正在接收纯ASCII数据,那么您希望将其转换为Uint8Array替代,并String.fromCharCode在其上进行映射.如果它是其他东西,例如UTF-8,那么你将不得不做一些其他的转换.

    但是,无论如何,套接字层总是可以自由地以任意长度的块发送数据.您的应用程序必须处理奇怪的大小,并保存您不能立即处理的任何剩余部分,以便您在收到下一个数据块时可以使用它.

    2022-12-13 07:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有