c语言中如何将十六进制转换成2个字节输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中如何将十六进制转换成2个字节输出相关的知识,希望对你有一定的参考价值。

main()
typedef unsigned long uint32_t;
typedef unsigned short uint16_t;
uint32_t MSGLEGTH=0x9001;
char msg[1];
char han[1];
int len= sprintf(msg,"%2c",MSGLEGTH);
printf("msg=%s,len=%d\n",msg,len);


我运行后怎么是msg= len=2,msg里怎么空的啊,谁能帮我找找原因,然后帮加以修改。

MSGLEGTH = 0x9001;
如果转换成char*字符串形式,内存中保存是什么数据呢 例如有可能是 0x00 0x00 0x90 0x01,
这样转换的字符可能就是 0x00 0x00 这样肯定打印不出来,即使是0x90,0x01也是不可见字符。

LZ希望打印出9001吧。其实先建立个16进制的表

char hex[]= '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f';

然后一位一位解析

例如 int i = 78908 16进制 0x1343c
int j;

第一个字节
j = 78908 %16;
可以输出hex[j];

i = i /16;

以此类推,把前面的字符取出来。追问

我这个主要是一个协议里的一个消息ID0x9001,放在一条消息中,占两个字节,怎么样能让接收端直接接收到就是9001.

追答

接收端接收到的就是0x9001,你只要考虑你发送出去的是低字节在前还是高字节在前就可以了,接收方按照你的发送方式组合成数字就是你要传送的数字,如果你要打印显示出去,可以使用上面的办法,或者使用printf(“%04x”, 0x9001)也可以。

追问

那我怎么判断哪个字节在前呢

追答

自己写个数据传过去看看,例如0x1234接收到的第一个字节是什么不就知道了吗?类似测试CPU存储类型的大端小端的都可以直接测试。

参考技术A

  

  c语言将十六进制转换成2个字节输出,参考代码如下:

  char msg[]=0x01,0x02,0x03, 0x04;
  for(i=0;i*2<3;i++)
  
       printf("0x%02x%02x\\n",msg[i*2],msg[i*2+1]);
  

参考技术B printf("msg=%s,len=%d\n",msg,len);
s%是输出字符串,并且字符串以'\0'结束,char msg[1];是一个字符,
printf("msg=%c,len=%d\n",msg,len);
看数值的话
printf("msg=%d,len=%d\n",(int *)msg,len);追问

我这个主要是一个协议里的一个消息ID0x9001,放在一条消息中,占两个字节,怎么样能让接收端直接接收到就是9001.

c语言中如何提取二进制数中的某一位?

下面是三种方式:

①通过模2除2(%2、/2)的方法

num%2——取出二进制的最后一位

num/2——右移去掉二进制的最后一位

通过while循环,依次取出二进制的最后一位数字判断是否为1,若为1则count++,while(num)只有当num变为0时循环结束。

问题:在测试-1出现bug,-1的二进制中应该有32个1,输出却为0。我们将-1带入代码中发现-1%2=0,count不增,然后-1/2=0,循环结束,故输出count的值为0。

解决方案:将变量num的数据类型改为unsigned int (无符号整型),此时表示的是正的整型的最大值,所以当num=-1时,表示二进制为32个1的正数,通过循环可以输出正确的个数。

②通过右移操作符(>>)、按位与操作符(&)实现

Example:当num=10(1010),通过右移操作num>>i,二进制向右移动i位。

//i=0,num>>0,右移0位,此时(1010)&(0001)=0

//i=1,num>>1,右移1位,此时(0101)&(0001)=1,count++

//i=2,num>>2,右移2位,此时(0010)&(0001)=0

//i=3,num>>3,右移3位,此时(0001)&(0001)=1,count++

……

因为二进制共32位,所以循环要执行32次后结束,得到count为2。

缺点:不够高效,必须循环32次。

③通过按位与操作符(&)巧妙运算实现

Example:  当num=15时,

1//num&(num-1)=(1111)&(1110)=(1110)    

2//num&(num-1)=(1110)&(1101)=(1100)   

3//num&(num-1)=(1100)&(1011)=(1000)   

4//num&(num-1)=(1000)&(0111)=0  ,循环停止。共执行4次while循环。

扩展资料

一、指定的某一位数置1

宏 #define setbit(x,y)  x|=(1<<y)

二、指定的某一位数置0

宏  #define clrbit(x,y)  x&=~(1<<y)

三、指定的某一位数取反

宏  #define reversebit(x,y)  x^=(1<<y)

四、获取的某一位的值

宏 #define getbit(x,y)   ((x) >> (y)&1)



参考技术A 利用按位求与运算
比如说
16位二进制数A:
1000 1000 1000 1000,
如果你想获A的哪一位
就把
数字B:
0000 0000 0000 0000的那一为设置为1.
比如说
我想获得A的第三位
就把B的第三位数字设置为1,则B为
0000 0000 0000 0100,之后A、B求与,
结果若为0,说明A的第三位为0,结果为1,说明A的第三位为1.

同理:若要获得A的第五位,
就把B设置为
0000 0000 0001 0000.
之后再求与。

通常在程序中
数字B被称为掩码,就是专门用来测试某一位是否为0的数值。

希望对你有用。
参考技术B 用&运算符
例如:得出1101 0011的第5位,
1101 0011&(1<<5)即可
参考技术C 例如 求10(1010)的第三位数
int a=10;
int b=a;
b=b>>(3-1)&1;
得到的b就是10的第三位本回答被提问者采纳
参考技术D #include <stdio.h>

//get_bit函数,获取变量num中的index位
int get_bit(int num, int index);

int main()
int num = 0x00001001; //十六进制相当于0000 0000 0000 0000 0001 0000 0000 0001

for(int i=0; i<32; i++)
printf("第%d位:%d\n", i+1, get_bit(num, i+1));

return 0;


int get_bit(int num, int index)
return (num>>(index-1)) & 0x00000001;

以上是关于c语言中如何将十六进制转换成2个字节输出的主要内容,如果未能解决你的问题,请参考以下文章

C语言编程(将十六进制字符串转换为十进制整数 )

用c语言编写函数,将输入的十进制数转换成十六进制数并输出

c语言怎么字符串和16进制转码 汉字转16进制如“我”转换成 “0xe68891”; 16进制转汉字“0xe68891”转 我

在C语言中如何将10进制转换成16进制?

python 数值转BCD,如何拼接二进制字符串

c语言中如何将16进制字符串转化成10进制整数?