Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.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中将UTF8转换为int16_Javascript_Node.js_Utf 8_Websocket - Fatal编程技术网

在javascript中将UTF8转换为int16

在javascript中将UTF8转换为int16,javascript,node.js,utf-8,websocket,Javascript,Node.js,Utf 8,Websocket,我在node.js代码中读取一个二进制文件(16位整数),并使用websocket的connection.sendUTF(数据)将其发送给客户端。在客户端的javascript代码中,我收到一个UTF8数组,并希望将每一对都转换回int16(如果简单的话,数字是无符号的) 我提出了这个在客户端使用的函数,并想知道它是否正确 function char2BigEndian16(hiChar, lowChar){ return ((lowChar.charCodeAt(0)& 0x

我在node.js代码中读取一个二进制文件(16位整数),并使用websocket的connection.sendUTF(数据)将其发送给客户端。在客户端的javascript代码中,我收到一个UTF8数组,并希望将每一对都转换回int16(如果简单的话,数字是无符号的)

我提出了这个在客户端使用的函数,并想知道它是否正确

function char2BigEndian16(hiChar, lowChar){
    return  ((lowChar.charCodeAt(0)& 0x00FF) << 8) | (hiChar.charCodeAt(0) & 0xFF);
}
如果此处的帮助是我的node.js代码被截断:

var fs = require('fs');
    filename = "test.txt";
    fs.readFile(filename, 'utf8', function(err, data) {
            if (err) {
                console.log('Error!!');
                return console.log(err);
            }
        connection.sendUTF(data);

        });
下面是我如何在客户端处理接收到的数据

connection.onmessage = function(e) {
                console.log(e.data.length);
}

正如@Guffa所指出的,你可能是从坏数据开始的。如果您的数据文件是16位值的原始二进制文件,那么将其作为UTF8编码的文本读取几乎肯定会失败。相反,省略
encoding
参数,以便在服务器端获得二进制数据的缓冲区,并使用websocket的
sendBytes
方法将其作为原始数据传输

然后,在客户端,websocket的消息事件应该提供一个
数据
属性,该属性是二进制数据的数组缓冲区(或者可能是
Blob
),然后可以通过以下方式将其转换为int16值:

function arrayByteToInt16(byteArray) {
  var ints = [];
  for (var i = 0; i < byteArray.length; i += 2) {
    // Note: assuming Big-Endian here
    ints.push((byteArray[i] << 8) | (byteArray[i+1]));
  }
  return ints;
}
函数数组字节数16(byteArray){
var ints=[];
对于(变量i=0;i内部推送((byteArray[i]不,这不会可靠地工作。UTF-8文件不是一组不同的8位值,每个字符可以使用一个或多个字节。当您将文件读取为UTF-8时,某些值将被解释为多字节组并转换为单个字符。您只能可靠地将实际创建为UTF-8文本文件的文件读取为UTF-8。

您需要在不使用编码的情况下读取文件,以便原封不动地返回数据:

fs.readFile(filename, function(err, data) {

现在,您可以将数据发送到客户端,每个字节将是原始文件中的一个字节。

Hmm,好的方面。可以使用String.fromCharCode()创建UCS-2编码字符串并通过sendUTF发送吗?(“不确定代理范围是否在这里起作用。)似乎他应该这样做或使用
sendBytes()
来发送原始数据。@broofa:好吧,以UTF-16的形式发送字节可能会起作用,但是流的大小是原始文件的两倍,仍然需要在客户端解码以修补8位值(从16位字符代码转换而来)转换为16位值。我假设服务器端
sendUTF
API将JS UCS-2字符串转换为UTF8。由于这是作为UTF8字符串发送的,所以我假设它将显示为[JS UCS-2]websocket
message
事件中的字符串-即OP不需要做任何特殊的事情来解码
messageData.charCodeAt(someIndex)
获取每个int16值。否?@broofa:您的意思是将文件作为UCS-2读取,尽管它根本不是文本文件,并将其作为文本发送……听起来数据可能有几种方式被破坏,例如字符代码规范化。@Cgraphics:我得出了相同的结论。如果它没有
长度,它就有要成为Blob,请使用
大小
。您可以使用
文件读取器
读取
Blob
:由于某些原因,将“e.data”作为此函数的输入将全部返回0!以及e.data.length返回错误(e.data.lengh不是函数)!检测到X Y问题-
fs.readFile(filename, function(err, data) {