1.接收蓝牙数据转10进制
// 十进制
const newArr = Array.from(new Uint8Array(res.value)); //res.value为arrayBuffer数据
that.wirteNewArr(newArr);
解释:为何需 高位 * 256 + 低位
在计算机中,二进制数以位为单位进行存储和处理。一个字节(byte)有 8 位,因此一个 16 位的二进制数可以被拆分为两个 8 位的字节(高位字节和低位字节)。在进行字节序的转换时,需要将高位字节与低位字节的顺序交换,也就是将高位字节放在低位字节的位置,将低位字节放在高位字节的位置。
因此,我们需要将高位字节左移 8 位,然后再加上低位字节,才能得到正确的结果。左移操作相当于将一个数乘以 256,因为 $2^8=256$。因此,左移 8 位相当于将高位字节乘以 256,然后加上低位字节,就可以得到正确的结果了。
举例来说,假设我们有一个 16 位的数:
0xABCD
。它的高位字节是0xAB
,低位字节是0xCD
。如果要将其转换为大端序,就需要将高位字节和低位字节的位置交换,变成:0xCDAB
。因此,我们需要计算出0xCDAB
对应的十进制数。计算的过程如下:0xABCD = 171 × 256 + 205 = 44,364 0xCDAB = 205 × 256 + 171 = 52,203
因此,此时的字节序就被正确地转换为了大端序。
2.高位 * 256 + 低位
getResultList(arr,flag) {
let list = [];
let num = '';
arr.forEach((item, index)=> {
if(index % 2 == 0) {
num = item * 256;
}else {
num += item;
if(flag === true) {
num = this.twosComplement(num,16);
}
list.push(num)
}
})
return list;
},
3.转有符号数
// 二进制补码 value:要转换的无符号整数,bits:该整数占用的二进制位数
twosComplement(value, bits) {
const max = 2 ** (bits - 1);
if (value < max) {
// 如果 value 小于 2^(bits-1),则 value 是一个非负数,直接返回即可
return value;
} else {
// 如果 value 大于等于 2^(bits-1),则 value 是一个负数,需要转换为补码表示
// 具体地,需要将 value 减去 2^bits,相当于将其最高位从 1 变为 0,其他各位不变
// 例如,对于 8 位二进制数来说,2^8 = 256,如果 value = 0b10000000(即 -128),则需要执行以下操作:
// value - 256 = 0b10000000 - 0b100000000 = 0b10000000 + 0b100000000 = 0b110000000 = -128
return value - 2 ** bits;
}
},
注解:twosComplement函数用于将一个无符号整数转换为有符号整数。具体地,对于一个
value
的bits
位二进制表示,如果最高位为 0,表示value
是一个正整数;如果最高位为 1,表示value
是一个负整数,采用二进制补码表示。函数的参数
value
表示要转换的无符号整数,bits
则表示该整数占用的二进制位数。函数的返回值为转换后的有符号整数。例如,对于值
0xFC0E
,它的二进制表示为1111110000001110
,共 16 位。因此,可以使用以下代码将其转换为有符号整数:const value = parseInt('FC0E', 16); // 将 0xFC0E 解析为十进制数,即 64526 const signedValue = twosComplement(value, 16); // 转换为有符号整数,即 -1007
因为
0xFC0E
的二进制表示的最高位是 1,所以它被解释为一个负整数。该函数将其转换为 16 位的二进制补码表示,即1111111111000001
,对应的十进制值为-1007
。
2 ** (16 - 1)注解
2 ** (16 - 1) 表示的是 $2^{15}$,即一个 16 位的二进制数中最高位的数字 1 所对应的十进制数。在二进制补码表示中,最高位表示符号位,因此,一个 16 位的有符号整数的取值范围为 $-2^{15}$ 到 $2^{15}-1$(即十进制数的范围为 $-32,768$ 到 $32,767$),其中正数采用原码或反码表示,负数采用补码表示。
因此,当我们需要判断一个 16 位的整数是否为负数时,可以通过检查最高位是否为 1 来确定。如果最高位为 1,那么这个数就是一个负数,需要使用二进制补码表示。而如果最高位为 0,那么这个数就是一个非负数,可以使用原码或反码表示。
在上面的代码中,使用 2 ** (16 - 1) 来计算一个 16 位有符号整数的最大正值,即 $2^{15}-1$,也就是 32,767。如果一个 16 位整数的值小于这个最大正值,那么它就是一个正数,表示方式与原码或反码相同;如果它的值等于或大于这个最大正值,那么它就是一个负数,需要使用二进制补码表示。