我一直在试图解决这个问题:
我从嵌入式设备收到了原始数据。从文档中,将其读入单个值的方法是:
每两个字节的数据可以组合成一个原始波形值。它的值是一个带符号的16位整数,范围从-32768到32767.Value的第一个字节代表两个字节的高位字节-compliment值,而第二个字节表示低位字节。要重建完整的原始波形值,只需将第一个字节左移8位,然后按位或按下 第二个字节。
short raw = (Value[0]<<8) | Value[1];
我收到的2个字节中有一个是“ef”。当我使用上面的按位操作时,结果似乎不正确,因为我注意到我从未得到单个负值(其ECG数据,负值是正常的)。我相信使用Javascript来做到这一点并不简单。 我这样做的方式是这样的:
var raw = "ef"; // just to show one. Actual one is an array of this 2 bytes but in string.
var value = raw.charAt(0) << 8 | raw.charAt(1)
请咨询。谢谢!
编辑:
我也是这样的:
let first = new Int8Array(len); // len is the length of the raw data array
let second = new Int8Array(len);
let values = new Int16Array(len) // to hold the converted value
for(var i=0; i<len ; i++)
{
//arr is the array that contains the every two "characters"
first[i] = arr[i].charAt(0);
second[i] = arr[i].charAt(1);
values[i] = first[i] << 8 | second[i];
}
但仍然都是积极的结果。没有负面的。有人可以验证我是否正确地执行此操作,以防万一这些值实际上都是正数:p
答案 0 :(得分:1)
您可以使用字符串已经是16位的属性,然后将其签名 而不是在时间读取8位,而是使用charCodeAt读取一个无符号16位。
var raw = "\u00ef"; //original example
var buf = new Int16Array(1);
buf[0] = raw.charCodeAt(0); //now in the buf[0] is typed 16 bit integer
//returns 239, for \uffef returns -17
var raw = "\uffef"; //original example
var buf = new Int16Array(1);
buf[0] = raw.charCodeAt(0); //now in the buf[0] is typed 16 bit integer
console.log(buf[0])
答案 1 :(得分:0)
它的两个补码:检查高字节的最高位 - 字节[高]&gt;&gt; 7。如果它为0,则执行byte [top]&lt;&lt; 8 |字节[低]。如果是1,请执行 - ((byte [top] ^ 0xff)&lt;&lt; 8 | byte [low] ^ 0xff) - 1.有关说明,请参阅https://en.wikipedia.org/wiki/Two%27s_complement。
同时查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays。它有Int16数组,这是你想要的。它可能会快一点。
答案 2 :(得分:0)
[编辑]
使用Int8Array存储字节数据:
function str2ua(str) {
var buf = new Int8Array(str.length);
for (var i = 0, strLen = str.length; i < strLen; i++) {
buf[i] = str.charCodeAt(i);
}
return buf;
}
var raw = 'ef';
var buf = str2ua(raw);
var val = buf[0] << 8 | buf[1];
console.log(val); // output 25958
raw = '¢f';
buf = str2ua(raw);
val = buf[0] << 8 | buf[1];
console.log(val); // output -23962
答案 3 :(得分:0)
对于第一个字节,首先取两个补码,然后移位8位
let x = raw.charCodeAt(0); //ASCII value of first character
然后将x翻转为1的补码并为2的补码添加+1,最后执行
var value = x << 8 | bytevalueof(raw.charCodeAt(1))
答案 4 :(得分:0)
这是关于raw wave data coming from a Neurosky Mindwave Mobile EEG headset的问题。
从设备读取数据时,应该在缓冲区中找到三个值。对后两个执行此操作以获得正确的读数:
var b = reader.buffer(3);
var raw = b[1]*256 + b[2];
if(raw >= 32768) {
raw = raw - 65536;
}