把十进制数转换成十六进制后如何分割高低字节

来源:互联网 发布:手机打击垫软件 编辑:程序博客网 时间:2024/05/22 00:53

http://blog.sina.com.cn/s/blog_61eff1c70100gh21.html

把十进制数转换成十六进制后如何分割高低字节

 

今天公司的项目,遇到一个问题:要把云台输入转动角度转换成十六进制后把高地位分开赋给另外两个参数,比如90°(云台协议规定要计算9000即输入的100倍的十六进制),9000的十六进制是2328,有两个变量angle1,angle2,应该得到angle1=0x23,angle=0x28;那么怎么实现呢?

刚开始上网搜到说有个函数 sprintf(buf, "%X", angle); 函数介绍:

sprintf() 格式化输出函数(图形)
功能: 函数sprintf()用来作格式化的输出。
用法: 此函数调用方式为int sprintf(char *string,char *format,arg_list);
说明: 函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组),然后再调用outtextxy()函数将串里的字符显示在屏幕上。arg_list为参数表,可有不定个数。通常在绘图方式下输出数字时可调用sprintf()函数将所要输出的格式送到第一个参数,然后显示输出。

我试着编写程序如下:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char BYTE;

int main() {
int angle = 9000;
BYTE angle1, angle2;
char* buf = (char *)malloc(sizeof(char)*5);
char buf[8];
sprintf(buf, "%X", angle);
int ibuf = atoi(buf);
int a1 = ibuf/100;
int a2 = ibuf%100;
angle1 = BYTE(a1);
angle2 = BYTE(a2);
printf("0x%x,0x%x\n",angle1 ,angle2);
return 0;
}

问题是,sprintf输出的是char*类型,比如本例是"2328",如果在用atoi函数只是转换为整数2328,分割后的angle1,angle2存储的是整数23,28完全不对。

后来经过思考和讨论想到了移位,果然是灵丹妙药啊:

int main() {
int angle = 9000;
BYTE angle1, angle2;
int tem1_angle = angle;
angle1 = BYTE(tem1_angle >> 8);
int tem2_angle = angle;
//angle2 = tem2_angle&(0xFF);
angle2 = BYTE((tem2_angle<<24)>>24);
printf("0x%x,0x%x\n",angle1 ,angle2);
return 0;

}
注释掉的句子可以代替其下面一句,但是明显移位是最牛逼的方法。

0 0
原创粉丝点击