在Javascript

时间:2017-09-13 04:14:59

标签: javascript

我一直在试图解决这个问题:

我从嵌入式设备收到了原始数据。从文档中,将其读入单个值的方法是:

  

每两个字节的数据可以组合成一个原始波形值。它的值是一个带符号的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

5 个答案:

答案 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;
    }