我需要从十六进制读取一些十进制值。
例如,我有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
}
}
谢谢
答案 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
}
}