c++ char[] 值转16进制

alexsun6 2016-12-07 09:53:50
现在有一个char数组,里面的值是十进制数据,比如:
unsigned char data[4]={44,55,66,77};


怎样把里面的每个数值转化为16进制数据?
unsigned char data[4]={0x2c,0x37,0x42,0x4d};
...全文
3122 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-06-25
  • 打赏
  • 举报
回复
/***** crc16.c *****/
#include <stdio.h>

#define CRC16_DNP   0x3D65u     // DNP, IEC 870, M-BUS, wM-BUS, ...
#define CRC16_CCITT 0x1021u     // X.25, V.41, HDLC FCS, Bluetooth, ...

//Other polynoms not tested
#define CRC16_IBM   0x8005u     // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ...
#define CRC16_T10_DIF   0x8BB7u     // SCSI DIF
#define CRC16_DECT  0x0589u     // Cordeless Telephones
#define CRC16_ARINC 0xA02Bu     // ACARS Aplications

#define POLYNOM     CRC16_DNP   // Define the used polynom from one of the aboves

// Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0).
unsigned short crc16(unsigned short crcValue, unsigned char newByte) {
    int i;

    for (i = 0; i < 8; i++) {
        if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){
            crcValue = (crcValue << 1)  ^ POLYNOM;
        } else {
            crcValue = (crcValue << 1);
        }
        newByte <<= 1;
    }
    return crcValue;
}

unsigned short exampleOfUseCRC16(unsigned char *Data, int len){

    unsigned short crc;
    int aux = 0;

    crc = 0x0000u; //Initialization of crc to 0x0000 for DNP
    //crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT

    while (aux < len){
        crc = crc16(crc,Data[aux]);
        aux++;
    }

    return (~crc); //The crc value for DNP it is obtained by NOT operation

    //return crc; //The crc value for CCITT
}

int main() {
    unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};

    printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078
    return 0;
}
oXingYu123456789q 2018-06-19
  • 打赏
  • 举报
回复
这赵4老师是个逗比吧。问你东你丫答西。你说那些sb都知道
白发22 2017-02-16
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
不需要转化,两者对电脑而言是一回事。 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵老师,我需要进行CRC16校验要转换成16进制进行计算,还是一样的么,还是要转化?
jiht594 2016-12-07
  • 打赏
  • 举报
回复
引用 2 楼 alexsun6 的回复:
[quote=引用 1 楼 jiht594 的回复:]

unsigned char data[4]= {44,55,66,77};
    char firstNum[32] = {0};
    sprintf(firstNum, "0x%x", data[0]);
数组firstNum中是第一个数,0x2c 存多个数,你需要一个二维数组
二维是指data数组要二维还是firstNum数组用二维?[/quote] 数据都是二进制的, unsigned char data[4]={0x2c,0x37,0x42,0x4d}; 和unsigned char data[4]={44,55,66,77}; 这2个写法是没有区别的。 我给你的代码是数字转成16进制字符串 (“0x2c” 这个加上\0是5个字符)
赵4老师 2016-12-07
  • 打赏
  • 举报
回复
不需要转化,两者对电脑而言是一回事。 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
paschen 版主 2016-12-07
  • 打赏
  • 举报
回复
unsigned char data[4]={44,55,66,77}; 与 unsigned char data[4]={0x2c,0x37,0x42,0x4d}; 在内存中都是一样的
alexsun6 2016-12-07
  • 打赏
  • 举报
回复
引用 1 楼 jiht594 的回复:

unsigned char data[4]= {44,55,66,77};
    char firstNum[32] = {0};
    sprintf(firstNum, "0x%x", data[0]);
数组firstNum中是第一个数,0x2c 存多个数,你需要一个二维数组
二维是指data数组要二维还是firstNum数组用二维?
jiht594 2016-12-07
  • 打赏
  • 举报
回复

unsigned char data[4]= {44,55,66,77};
    char firstNum[32] = {0};
    sprintf(firstNum, "0x%x", data[0]);
数组firstNum中是第一个数,0x2c 存多个数,你需要一个二维数组

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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