C++常见十六进制数组转换char数组方法

摘要

C++在编写通讯协议解析过程中,通常需要对十六进制进行解析,经常用到位运算,同时结合unsigned char型数据或者char数组解析出自己想要的十进制数字,这里总结了一下常用的十六进制转换十进制或char数组的思路。

源代码

0x20,0x20变成8224,即0x2020转成8224

unsigned char buff[2] = {0x20,0x20};
//先把0x20,0x20转成0x2020
int number_1 = (buff[0]<<8)|buff[1];
//显示合并后的十六进制数字
printf("%02X",number_1);
//十进制显示
cout<<"转化成十六进制的数值为:"<<number_1<<endl;

十进制10000000转十六进制0x00989680,再转成0x00,0x98,0x96,0x80

int value = 10000000;
//十进制转十六进制
int hex_1 = 0x00|(value); 
//cout只能显示十进制,十六进制显示要用printf 
printf("%02X",hex_1);
//取不同位数,转化成0x00,0x98,0x96,0x80
int hexNum[4];
hexNum[0]=((0x00|(value)) & 0xff000000)>>24;
hexNum[1]=((0x00|(value)) & 0xff0000)>>16;
hexNum[2]=((0x00|(value)) & 0xff00)>>8;
hexNum[3]=((0x00|value))  & 0xff;
//显示转化后的十六进制数组
for(int i=0;i<4;i++)
{
    printf("%02X",hexNum[i]);
}

从十六进制数组中,取某几个字节,并转化为整数

//取4-6组成整数
char buf[6] = {0x12,0x12,0x23,0x00,0x00,0x02};
unsigned int number_2 = (((buf[3]<<8)|buf[4])<<8)|buf[5];
cout<<number_2<<endl;

取十六进制的高位,低位(左移,右移几位,主要看后面有几个零)

int number_3 = 0x234500;
//取高位
int highValue = (number_3 & 0xff0000)>>16;
//取低位
int lowValue = number_3 & 0xff;
printf("%02X",highValue);
printf("%02X",lowValue);

取十六进制数组前几位,判断数值

char hexBuf[100] = {0x13,0x14,0x14,0x16,0x17,0x16,0x00};
//取前四个数据
char *headBuff = new char[4];
memcpy(headBuff,hexBuf,4);
//强转前几个十六进制为整数
unsigned __int64 dat = *((unsigned __int64*)headBuff);   //这样转换,数组会逆序
switch(dat)
{ 
   case 0x16141413:
   { 
      cout<<"转化成了整数";
   }
}

数值计算 |和 & 是逆运算 , 先 & 后 | 数值不变,先 | 后 & 数值不变

int number_4 = 0x001;
int number_5 = 0x002;
//最后输出的结果是number_4
int judgeNumber_1 = (number_4 | number_5) & number_4;
int judgeNumber_2 = (number_4 & number_5) | number_4;
cout<<"最终的结果:"<<judgeNumber_1<<endl;
cout<<"最终的结果:"<<judgeNumber_2<<endl;

使用sprintf_s可以将不同的数值数组,可以按照自定义格式转换成短的字符串

//sprintf_s(输出的字符串,输出的字符串长度,数据输入格式,不同类型数据);
/*其中自定义输出格式为:
  %%百分比符号
  %c ASCII字元
  %d 十进制整数
  %f 浮点数
  %o 整数转成八进制
  %s 字符串
  %x 整数转成小写十六进制
  %X 整数转成大写十六进制
  %02x 整数转成小写十六进制,不足两位的会高位补0,比如,0格式化为00,1格式化为01,64格式化为64
  %-02x 整数转成小写十六进制,不足两位的会低位补0,比如,0格式化为00,1格式化为10,64格式化为64
*/
char fileName[20] = {0};   //需要预先分配缓冲区
int number11 = 0x1997;
int number22 = 0x01;
int number33 = 0x18;
sprintf_s(fileName,sizeof(fileName),"%x-%x-%x",number11,number22,number33);
cout<<fileName<<endl;

sscanf_s可以将固定格式的字符串,转化为其他格式的数:

//sscanf_s(字符串,字符串转化格式,输出的数据);
char *chNum = "reg=0x34";
int iNum;
sscanf_s(chNum,"reg=0x%x",&iNum);
//显示转化后的十六进制数字
printf("iNum是:",iNum);
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手写不期而遇

感谢你的打赏,也欢迎一起学习

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值