十六进制流到 ASCII 转换器
本主题讨论将十六进制值流转换为相应 ASCII 值的方法
介绍
这里提供的代码用于将从网络接收到的十六进制值流转换为相应的 ASCII 值。十六进制值的每 4 位以其对应的 8 位格式出现在流中。
背景
我们正在进行一个项目,我们接收到的是一个实际上的十六进制流。现在流中的每个字符实际上只代表十六进制值的 4 位。因此,需要 2 个字符才能形成实际的十六进制值。我检查了互联网以寻找快速解决方案,但对看到的内容并不满意。所以我决定自己编写一个。我不会说这是最好的解决方案。但它足够快。
使用代码
可以通过将字符数组 arr 传递给函数 hexToAscii() 来使用该代码。这里,2 个不同的字符实际上是十六进制值的 2 个半字节。因此,606162 实际上被解码为 0x60、0x61、0x62,依此类推。结果存储在整数数组 destElements 中。
srcElements 是作为输入参数传递的数组的大小(这里是 arr)。
unsigned char arr[] = {"606162636465666768696a6b6c6d6e6f\
707172737475767778797a7b7c7d7e7f8081828384858687"};
char *hexToAscii (char *srcHex, int *destElements, int srcElements)
{
int index, destIndex;
unsigned char valUpper, valLower, *ascArray;
int lowerFlag;
lowerFlag = 0;
ascArray = NULL;
*destElements = srcElements/2;
ascArray = (char *)malloc (*destElements);
if (ascArray == NULL) {
return NULL;
}
for (destIndex = 0; destIndex < *destElements; destIndex++) {
// Every hex value will be 2 nibbles long and will take up 2 character
// space in the character array (Input)
for (index = 0; index < 2; index++) {
if (lowerFlag == 0) {
if (srcHex[(destIndex * 2) + index] >= '0' &&
srcHex[(destIndex * 2) + index] <= '9') {
valUpper = srcHex[(destIndex * 2) + index] - '0';
} else if (tolower (srcHex[(destIndex * 2) + index]) >= 'a' ||
tolower (srcHex[(destIndex * 2) + index]) <= 'f'){
valUpper = tolower(srcHex[(destIndex * 2) + index]) - 'a' + 10;
}
// The first character represent the upper nibble (upper 4 bits)
// of the hex value. Shift the converted value left 4 bits
valUpper <<= 4;
lowerFlag = 1;
} else {
if (srcHex[(destIndex * 2) + index] >= '0' &&
srcHex[(destIndex * 2) + index] <= '9') {
valLower = srcHex[(destIndex * 2) + index] - '0';
} else if (tolower (srcHex[(destIndex * 2) + index]) >= 'a' ||
tolower (srcHex[(destIndex * 2) + index]) <= 'f'){
valLower = tolower (srcHex[(destIndex * 2) + index]) - 'a' + 10;
}
lowerFlag = 0;
}
}
// ANDing upper and lower values will get the proper 8 bit ASCII converted val
ascArray[destIndex] = valUpper | valLower;
}
return ascArray;
}
兴趣点
编写这段代码只是为了好玩 :-) 。
历史
N/A