今天公司的项目,遇到一个问题:要把云台输
入转动角度转换成十六进制后把高地位分开赋给另外两个参数,比如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;
}
注释掉的句子可以代替其下面一句,但是明显移位是最牛逼的方法。