代码示例
/*---------如何将16进制数转换为字符串?---------
-----------如何将字符串转换为数据?------------*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#define SIZE 7
char *c1 = "ABCD123400001111"; //待测试字符串 高位在前
uint16_t array[SIZE] = {0xABC,0x123,0xFFF,4095,100,8,6}; //待测试16进制数组
int main(void) {
int i, len;
uint32_t temp[30] = { 0 };
char temp1[50] = { 0 };
/*函数声明*/
void HexToAscii(uint8_t *src, char *dest, int len); //16进制数转换为字符串
char lowtocap(char c); //小写字母转大写字母
void AsciiToHex(char *src, uint32_t *dest, int len); //字符串转16进制数
/**
* @brief 字符串长度判断处理
* @note 字符串两个一组,不足两个当一组处理
*/
AsciiToHex(c1, temp, strlen(c1)); //字符串 c1 转16进制数
if (strlen(c1) % 4 > 0) //字符串长度为奇数,进1
{
len = strlen(c1) / 4 + 1;
}
else //字符串长度为偶数
{
len = strlen(c1) / 4;
}
for (i = 0; i < len; i++)
{
printf(" AsciiToHex int[%d] is %X,%d \n", i + 1, temp[i], temp[i]); //%x十六进制 %d十进制
}
HexToAscii(array, temp1, SIZE); //16进制数组 s 转换为字符串
printf("\n HexToAscii temp1 is %s \n\n", temp1);
return 0;
}
/**
* @brief Hex transform to ascii string
* @note 16进制数转换为字符串
* @param *src : 字符串指针
* @param *dest : 数组指针
* @param len : 字符串长度 strlen(c1)不包括结束字符(即 null 字符)
* @retval void
*/
void HexToAscii(uint16_t *src, char *dest, int len)
{
char dh1, dl2, dl3; //字符串的高位和低位
int i;
if (src == NULL || dest == NULL)
{
printf("src or dest is NULL\n");
return;
}
if (len < 1)
{
printf("length is NULL\n");
return;
}
for (i = 0; i < len; i++)
{
//printf("i = %d , %x\n",i, src[i]);
dh1 = '0' + src[i] / 256;
dl2 = '0' + src[i] % 256 / 16; //以0为基准 dh='0'+AB/16=48+10=58
dl3 = '0' + src[i] % 16; //dl='0'+AB%16=48+11=59
if (dh1 > '9')
{
dh1 = dh1 - '9' - 1 + 'A'; // 或者 dh1= dh1+ 7; dh1=65(A)
}
if (dl2 > '9')
{
dl2 = dl2 - '9' - 1 + 'A'; // 或者 dl2= dl2 + 7; dl2=66(B)
}
if (dl3 > '9')
{
dl3 = dl3 - '9' - 1 + 'A'; // 或者dl3 = dl3 + 7; dl3=67(C)
}
dest[3 * i] = dh1;
dest[3 * i + 1] = dl2;
dest[3 * i + 2] = dl3;
}
dest[3 * i] = '\0'; //字符串结尾
}
/**
* @brief ascii string transform to 16 jinzhi Hex.
* @note 字符串转16进制数
* @param *src : 字符串指针
* @param *dest : 数组指针
* @param len : 字符串长度 strlen(c1)不包括结束字符(即 null 字符)
* @retval void
*/
void AsciiToHex(char *src, uint32_t *dest, int len)
{
int dh1 , dh2 , dl1 , dl2; // 16进制的高4位和低4位
char ch1 , ch2 , cl1 , cl2; //字符串的高位和低位
int i;
if (src == NULL || dest == NULL)
{
printf("src or dest is NULL\n");
return;
}
if (len < 1)
{
printf("length is NULL\n");
return;
}
for (i = 0; i < len; i++)
{
ch1 = src[4 * i]; //字符串高位
ch2 = src[4 * i + 1]; //字符串高位
cl1 = src[4 * i + 2]; //字符串低位
cl2 = src[4 * i + 3]; //字符串低位
dh1 = lowtocap(ch1) - '0'; //dh1 = 'A'- '0' = 17 (ASCII) 16进制高四位
if (dh1 > 9)
{
/*lowtocap可以用库函数toupper*/
dh1 = lowtocap(ch1) - 'A' + 10; //dh1 = 'A'- 'A' + 10 = 10 (ASCII)
}
dh2 = lowtocap(ch2) - '0';
if (dh2 > 9) //dh2 = 'B'- '0' = 18 (ASCII)
{
dh2 = lowtocap(ch2) - 'A' + 10; //dh2 = 'B'- 'A' + 10 = 11 (ASCII)
}
dl1 = lowtocap(cl1) - '0'; //dl1 = 'C'- '0' = 19 (ASCII)
if (dl1 > 9)
{
dl1 = lowtocap(cl1) - 'A' + 10; //dl = 'C'- 'A' + 10 = 12 (ASCII)
}
dl2 = lowtocap(cl2) - '0'; //dl = 'D'- '0' = 20 (ASCII)
if (dl2 > 9)
{
dl2 = lowtocap(cl2) - 'A' + 10; //dl = 'D'- 'A' + 10 = 13 (ASCII)
}
dest[i] = dh1 * 4096 + dh2 * 256 + dl1 * 16 + dl2; //数组赋值 dest[0] = 10*4096 + 11*256 + 12*16 + 13 = 43981
}
if (len % 4 > 0) //字符串个数为奇数 len = 11
{
dest[len / 4] = src[len - 1] - '0'; //落单字符单独成组 数组从0开始计数
if (dest[len / 4] > 9) // >9 使用字母表示,以A为基准 <9 直接数字表示
{
dest[len / 4] = lowtocap(src[len - 1]) - 'A' + 10;
}
}
}
/**
* @brief lowercase letters transform to capital letter
* @note 小写字母转大写字母
* @param c : 入口参数 char字符
* @retval char
*/
char lowtocap(char c)
{
if ((c >= 'a') && (c <= 'z'))
{
c = c - 32; // 或者c = c + ('a' - 'A');
}
return c;
}
运行结果
参考链接:
16进制与字符串相互转换(C语言)