分享

十六进制高低位分割(转换)

 JasonQue 2012-04-07

今天公司的项目,遇到一个问题:要把云台输 入转动角度转换成十六进制后把高地位分开赋给另外两个参数,比如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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多