打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
打印十六进制
printf(),fprintf(),sprintf()函数的区别
哈工大操作系统实验---lab8:proc文件的实现
Linux下c基于openssl生成MD5的函数
C语言itoa()函数和atoi()函数详解(整数转字符C实现)
sprintf的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服