如何正确处理JavaScript中的字节读取?如何正确选择位置

时间:2019-06-10 11:24:18

标签: javascript hex

我需要从十六进制读取一些十进制值。

例如,我有2费率电价计量,并使用LoRa IOT设备读取并向我的服务器发送2个整数值33780和6687(千瓦)。

它们在此HEX消息中的第4至6位和第8至10位编码。使用JavaScript,我需要转换回整数值。

80 ff 02 00 83 f4 03 00 1a 1f fe f1

00 83 f4 = 33780

00 4a 4f = 6687

因此,我有一些JavaScript示例,但我无法适合阅读的正确位置。问题当然在第2行和第3行。

function Decoder(bytes) {
  var T2 = bytes[1]<<24>>16 | bytes[0];
  var T1 = bytes[4]<<6 | bytes[3];

  return {
    vysoky_tarif: T2,
    nizky_tarif: T1
    
  }
}

谢谢

2 个答案:

答案 0 :(得分:1)

  

是的,“ 80 ff 02 00 83 f4 03 00 1a 1f fe f1”是服务器接收的字符串,需要解析字节4-6和8-10上的数据。

字符串和字节之间的差异与图片和您之间的差异相同。和你的照片聊天没什么意义。

因此,首先我们必须将此字符串解析为我们可以处理的数字。 然后我们需要获取您想要的号码。

imo。 24位数字非常少见,对于8、16和32位值,您可以使用DataView来获取/设置数组中的值,对于24位,我们需要获取字节并手动构建整数。

// your input, a string
var text = "80 ff 02 00 83 f4 03 00 1a 1f fe f1";

// parsed and converted into an Array of Bytes.
var bytes = new Uint8Array(text.split(" ").map(v => parseInt(v, 16)));

// a utility to read int24 from the array
function getInt24(bytes, index) {
  return (bytes[index] << 24 | bytes[index + 1] << 16 | bytes[index + 2]<<8) >> 8;
}

// 1st byte is at index 0
var v1 = getInt24(bytes, 3);
var v2 = getInt24(bytes, 7);

console.log(v1, v2);
.as-console-wrapper{top:0;max-height:100%!important}

答案 1 :(得分:0)

这是最终的工作代码:

function Decoder(bytes) {

// a utility to read int24 from the array
function getInt24(bytes, index) { return (bytes[index] << 24 | bytes[index + 1] << 16 | bytes[index + 2]<<8) >> 8;
}

// 1st byte is at index 0
var v1 = getInt24(bytes, 3);
var v2 = getInt24(bytes, 7);


return {
    vysoky_tarif: v1,
    nizky_tarif: v2
       }
}