怎样把3个BYTE类型的16进制合并再转换为十进制

技术大白 2017-01-18 03:39:20
现在有三个BYTE类型的16进制数
b[0]=04;
b[1]=c2;
b[2]=da;
怎样把它们合并后,再转换为十进制
...全文
781 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
技术大白 2017-01-22
  • 打赏
  • 举报
回复
非常感谢大神的指导,在这条路上还有很长的路要走,好多东西要学
赵4老师 2017-01-18
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
赵4老师 2017-01-18
  • 打赏
  • 举报
回复
作为一个C程序员,对 scanf,sscanf,fscanf printf,sprintf,fprintf 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
赵4老师 2017-01-18
  • 打赏
  • 举报
回复
#include <stdio.h>
typedef unsigned char BYTE;
BYTE c[3]={0x04,0xc2,0xda};
int d;
char b[3][3]={"04","c2","da"};
char s[7];
int main() {
    d=(
        (
            (unsigned int)c[0]
        )<<16
      )
     +(
        (
            (unsigned int)c[1]
        )<<8
      )
     +      (unsigned int)c[2];
    printf("%06x\n%d\n",d,d);

    printf("%s %s %s\n",b[0],b[1],b[2]);
    sprintf(s,"%s%s%s",b[0],b[1],b[2]);
    sscanf(s,"%6x",&d);
    printf("s:%s\n%d",s,d);

    return 0;
}
//04c2da
//312026
//04 c2 da
//s:04c2da
//312026
//
技术大白 2017-01-18
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
括号多了还真容易落啊!
d=(
    (
        (unsigned int)c[0]
    )<<16
  )
 +(
    (
        (unsigned int)c[1]
    )<<8
  )
 +      (unsigned int)c[2];
C语言排版就是能如此自由!
大神b[0]=0x04;这里的0x怎么加,用sprintf不行,求大神指导
赵4老师 2017-01-18
  • 打赏
  • 举报
回复
括号多了还真容易落啊!
d=(
    (
        (unsigned int)c[0]
    )<<16
  )
 +(
    (
        (unsigned int)c[1]
    )<<8
  )
 +      (unsigned int)c[2];
C语言排版就是能如此自由!
技术大白 2017-01-18
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
怎么合并,加减乘除还是作为24位数处理,大端、小端,有符号、无符号?
引用 3 楼 zhao4zhong1 的回复:
BYTE b[3];
int d;
b[0]=0x04;
b[1]=0xc2;
b[2]=0xda;
d=((unsigned int)b[0])<<16)+((unsigned int)b[1])<<8)+(unsigned int)b[2];
大神可以不加ox不,我从电机取出来没有,不想加了,上边两个掉了两个括号 d=(((unsigned int)c[0])<<16)+(((unsigned int)c[1])<<8)+(unsigned int)c[2];
赵4老师 2017-01-18
  • 打赏
  • 举报
回复
printf("%d\n",d);
赵4老师 2017-01-18
  • 打赏
  • 举报
回复
BYTE b[3];
int d;
b[0]=0x04;
b[1]=0xc2;
b[2]=0xda;
d=((unsigned int)b[0])<<16)+((unsigned int)b[1])<<8)+(unsigned int)b[2];
技术大白 2017-01-18
  • 打赏
  • 举报
回复
就是合并成04c2da的形式
  • 打赏
  • 举报
回复
怎么合并,加减乘除还是作为24位数处理,大端、小端,有符号、无符号?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧