gpt4 book ai didi

javascript - 将字节数组转换为 320 位,然后提取 16 位,然后提取 10 位

转载 作者:行者123 更新时间:2023-12-04 17:07:25 25 4
gpt4 key购买 nike

我希望这里的一些聪明人能够帮助我,我是 JavaScript 的新手,并且试图弄清楚如何编写以下代码,因为当有效负载字符串不是标准的 8 位 1 字节组时我被卡住了,所以我收到 320 位 40 字节数组。前几个值可以很好地提取,因为它们是 16 位,然后是 8 位,然后是 32 位信息,但下一个值只有 10 位,我被困在这里。所以我可能应该将 40 字节转换为 320 位,然后为每个变量的每个位数右移?我不知道该怎么做。这是我的有效负载格式,括号中是该变量的位数。任何帮助将不胜感激。

https://www.iotsoundsensor.com/wp-content/uploads/2021/11/310_payload_parser_manual.html

function Decoder(bytes, port) {
//8 bit single byte values
var messageinfo = bytes[2]>>[2];

var battery = bytes[2]>>[0];
var latitude = bytes[4]>>[4];
var longatude = bytes[4]>>[4];

//now have 10 bit values to decode

var LAfast = bytes[15]>>>[0];
var LAslow = bytes[16]>>>[2];

return {
messageinfo: messageinfo,
battery: battery/10,
LAfast : LAfast/10,
LAslow : LAslow/10,
latitude: latitude,
longatude: longatude

}
}

最佳答案

我已经根据 iot-source 处的 JavaScript 代码重写了 Decode() 函数(这真的是解码这些信息的圣经)。

我创建了一个 getField() 函数用于在给定的偏移量、长度和分辨率下解码字段,还创建了一个 getBits() 函数来检索数组用于稍后解码的位(用于 LAxxx 字段)。

我使用上面页面中的示例作为 Decode() 的输入:

function hexToByteArray(hex) {
return Array.from({ length: hex.length/2}, (v,n) => parseInt(hex.slice(n * 2, n*2 + 2), 16));
}

function getField(offset, length, bytes, resolution = 1) {
return bytesToNum(bytes.slice(offset, offset + length)) * resolution;
}

function bytesToNum(bytes) {
return bytes.reduce((acc, b, x) => acc | (b << (x * 8)), 0);
}

// Convert a byte segment to bits
function getBits(offset, length, bytes) {
return bytes.slice(offset, offset + length).map((byt) => {
return Array.from({ length: 8 }).map((x, i) => {
return ((byt * (2 ** i) & 0x80) !== 0 ? 1 : 0);
});
}, []).flat();
}

function parseBits(bits) {
return bits.reduce((acc, b, i) => {
return acc + 0.1*(bits[bits.length - 1 - i] ? 2**(i): 0);
}, 30);
}

function Decoder(bytes, port) {
let offset = 0;
let messageinfo = getField(offset, 2, bytes, 1);

let battery = getField(offset += 2, 1, bytes, 0.1);
// NB: We should check messageinfo to ensure these are actually present...
let latitude = getField(offset += 1, 4, bytes, 1e-7);
let longitude = getField(offset += 4, 4, bytes, 1e-7);

// Skip parsing timestamp for now...
offset += 4

let bitArray = getBits(offset += 4, 20, bytes);

let bitIndex = 0;
let LAfast = parseBits(bitArray.slice(bitIndex, bitIndex += 10));
let LAslow = parseBits(bitArray.slice(bitIndex, bitIndex += 10));
let LCfast = parseBits(bitArray.slice(bitIndex, bitIndex += 10));
let LCslow = parseBits(bitArray.slice(bitIndex, bitIndex += 10));

return {
messageinfo,
battery,
LAfast,
LAslow,
LCfast,
LCslow,
latitude,
longitude
}
}

let bytes = (hexToByteArray('7FFF3F6599341FE38C11036A608C60370DA561584699336CDB55CDB390F44BD4B5B9D5390E34BCE3'))
console.log(Decoder(bytes))
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 将字节数组转换为 320 位,然后提取 16 位,然后提取 10 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70302384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com