蓝牙arrayBuffer数据转10进制在转有符号数

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 位整数的值小于这个最大正值,那么它就是一个正数,表示方式与原码或反码相同;如果它的值等于或大于这个最大正值,那么它就是一个负数,需要使用二进制补码表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值