将数组缓冲区转换为字符串
converting array buffers to string
当将数组缓冲区转换为字符串,然后在div中显示输出时,我得到了一些奇怪的结果。
我正在从一个铬包装的应用程序中的USB端口获取一些GPS数据。它将从端口接收的数组缓冲区转换为字符串并输出。功能包括:
var onReceiveCallback = function(info) {
if (info.connectionId == connectionId && info.data) {
$(".output").append(ab2str(info.data));
}
};
/* Interprets an ArrayBuffer as UTF-8 encoded string data. */
var ab2str = function(buf) {
var bufView = new Uint8Array(buf);
var encodedString = String.fromCharCode.apply(null, bufView);
return decodeURIComponent(escape(encodedString));
};
我有一个启动和停止按钮,可以明显地启动和停止从gps设备读取数据。当我第一次启动它时,它按预期工作并输出,类似于:
$GPGGA,214948.209,,,,0,0,,,M,,,*41$GPGSA,A,1$GPGSV,1,1,01,07,,,33*7F$GPRMC,214948.209,V,,,,0.00,0.00270814,,,N*4C$GPGGA,214949.209,,,,0,0,,,M,,,*40$GPGSA,A,1$GPGSV,1,1,01,07,,,34*78$GPRMC,214949.209,V,,,,0.00,0.00270814,,,N*4D
但是,当我停止并重新启动它时,尽管我清除了输出div,但输出数据似乎与之前的结果混合在一起。类似:
$$GPGPGGGGAA,,221155115544..202099$$GGPPGGSSAA,,AA,,,11$$GGPGPGSSVV,,,11,,,0022,,0077,,,,3344,1177,,、,,3311**77FF$$ggpprmmcc,,212155115544..220099,,VV$$GPGGPGGGAA,,221155115555..220099$$GGPPGGSSAA,,AA,,,11$G$GPPGGSSVV,,,11,,,0022,,0077,,,,331,11177,,、,,2255**77FF$$ggpprmmcc,221155115555..220099,,,VV,,,,00..0000,,00.0000,227700881144,,,N*N*4499
这就像一个缓冲区或变量没有被清空,或者其他我无法理解的疯狂事情。感谢任何指点。
编辑:
这是"启动"函数,它清除输出div并重新连接:
// when the start button is clicked
$( "#start" ).click(function() {
if ( deviceId == 0 ) {
console.log("Please select a device");
return;
}
else {
$(".output").empty();
serial.connect(deviceId, {bitrate: 9600}, onConnect);
}
});
我在自己的代码中发现这种技术不可靠,尽管我不记得这个问题是否与您报告的问题类似:
var ab2str = function(buf) { // not reliable
var bufView = new Uint8Array(buf);
var encodedString = String.fromCharCode.apply(null, bufView);
return decodeURIComponent(escape(encodedString));
};
所以,我是这样做的,代码取自谷歌Chrome应用程序的一个例子(tcpserver):
function ab2str(buf, callback) {
var bb = new Blob([new Uint8Array(buf)]);
var f = new FileReader();
f.onload = function(e) {
callback(e.target.result);
};
f.readAsText(bb);
}
请注意,这个版本并不是一个完全的替代版本,因为它是异步的。
现在,从Chrome版本38(现在是测试版)开始,你可以这样做:
function ab2str(buf) {
var dataView = new DataView(buf);
var decoder = new TextDecoder('utf-8');
return decoder.decode(dataView);
}
由于我一直在运行测试版,并为即将出版的书准备示例,我现在正在以最新的方式进行测试。试试看你的问题是否解决了。如果没有,我认为我对info.data
进行检查的建议仍然很好。
更新:我刚刚检查了这个反向功能,你可能会在某个时候发现它很方便:
function str2ab(buf) {
var encoder = new TextEncoder('utf-8');
return encoder.encode(buf).buffer;
}
- 如何在JavaScript中将字符串转换为函数引用
- 如何在 Javascript 中将变量的值从字符串转换为整数
- 将字符串转换为格式化日期
- IE在将字符串转换为日期时从日期中删除4小时
- node.js将字符串转换为要上传到Web服务器的文件
- 将字符串转换为JS对象
- 在js中将字符串转换为十六进制
- 试图了解如何使用parseFloat将字符串转换为数字
- 如何在html中将字符串转换为数字?以及如何将变量传递到scriptlet代码中
- 将字符串转换为GWT中的JSON对象(JSNI)
- 如何使用Razor显示模板将字符串转换为html字符串
- 将字符串转换为数组编号Javascript
- js字符串转换为具有两个值的对象
- 转换<a>使用jQuery将文本字符串转换为dom元素
- Jquery-将字符串转换为reg exp对象
- 使用JavaScript将客户端日期/时间字符串转换为JSON日期/时间串
- 将JavaScript字符串转换为整数
- moment js,将EST字符串转换为UTC
- 如何在javascript中将字符串转换为有效日期
- 通过JQuery将字符串转换为JSON