蓝牙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 = -128return 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 位整数的值小于这个最大正值,那么它就是一个正数,表示方式与原码或反码相同;如果它的值等于或大于这个最大正值,那么它就是一个负数,需要使用二进制补码表示。
蓝牙arrayBuffer数据转10进制在转有符号数相关推荐
- Java 将26进制数据转为10进制、十进制数据转为其它进制
1.十进制数据转为其它进制 /*** 进制转换* @param data 十进制数据* @param radix 待转换的进制* @return 转换后的字符串显示*/private String t ...
- 随记 oracle to_number将16进制的数据转换为10进制
--f: 需要转换的参数,xx:转换后的位数 select to_number('f','xx') from dual;
- Python实现16进制转10进制算法及源码
Python实现16进制转10进制算法及源码 16进制是一种常用的数学计数方式,而在Python中将16进制数据转换为10进制数据是非常简单和快捷的.下面我将展示如何使用Python实现16进制转10 ...
- 超大数据10进制转2进制详解(可推广到其他进制)/ Codeup 100000579 问题 C: 进制转换
问题C:进制转换 时间限制 内存限制 1.000sec 32MB 题目描述: 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入: 多组数据,每行为一个长度不超过30位的十进制非负整 ...
- 关于signed char类型的16进制数据转成带符号的10进制问题
文章目录 前言 signed char类型的16进制数据如何转成带符号的10进制数? 总结 前言 在最近的学习中,遇到了一个疑惑,三组16进制的数据分别为0xFF,0xF3,0x2A;这三组16进制的 ...
- mysql 10 进制 转36_mysql 10进制与35进制之间的转换 注意Power处理bigint的问题
35进制的目的是防止0和O造成的视觉误差 BEGIN DECLARE m_StrHex35 VARCHAR(100); -- 返回35进制表示的结果 DECLARE m_Remainder BIGIN ...
- 10进制转换成其他进制-短除法
将10进制下的n转换成b进制下的数. 代码如下: char get(int x) {if (x<=9) return x+'0';return x-10+'A'; }string base(in ...
- 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换
为什么要使用进制数 数据在计算机中的表示,最终以二进制的形式存在 , 就是各种 <黑客帝国>电影中那些 0101010- 的数字 ; 我们操作计算机 , 实际 就是 使用 程序 和 软件 ...
- SQL 16进制数转化10进制
16进制数"0X00037FFE9994EE5E"转化为10进制是多少? 我们用SQL转化察看下: select CONVERT(bigint,cast(0X00037FFE999 ...
最新文章
- 比拼 Kafka , 大数据分析新秀 Pulsar 到底好在哪
- 前端网络知识目录(持续更新)
- 打算近期去深圳找工作
- HDLBits答案(21)_Verilog有限状态机(8)
- 与时间相关的java源码_Java 调整日期和时间
- 计算机打印中 进纸盘2,软件、计算机和打印机接口问题-HP.PDF
- 语言运算顺序题目_我的Python学习笔记:今天我学了关于Python里的运算符及运算顺序...
- 海康威视、大华监控摄像头rtsp地址规则
- Java虚拟机(四)——类加载机制
- spring boot @value_spring+vue全栈开发实战-第二章Spring Boot 基础配置-笔记0302-2020
- 深入理解C语言指针的奥秘-4
- 在 Mac 上如何获取扩展来自定 Safari 浏览器?
- 240.搜索二维矩阵II
- gorm软删除_删除 |《GORM 中文文档 v1》| Go 技术论坛
- VUE引入阿里icon
- Android 10 使用PreferenceScreen的方法
- WIN7系统下安装SQLServer2000 + sp4数据库报错之解决办法
- doc、docx文档批量合并
- ios审核要注意的地方(转)
- 大话设计模式C++实现-第7章-代理模式