65.9K
CodeProject 正在变化。 阅读更多。
Home

十六进制流到 ASCII 转换器

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2009年3月31日

CPOL

1分钟阅读

viewsIcon

38518

downloadIcon

695

本主题讨论将十六进制值流转换为相应 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

© . All rights reserved.