编解码:十六进制编解码

  • Post author:
  • Post category:其他


编解码:十六进制编解码

信息有多种表现形式:二进制、十进制、十六进制、字符串…

在计算机中,信息是以二进制的形式来表现。

可以人为定义:0就是假,1就是真,等等。

所谓编解码,是将一种数据以另一种形式来表现,若正向变换称为编码,则其逆向过程则为解码。

计算机中,数据的本质是一串二进制0和1的字符串。

例如,二进制字符串0a代表十进制字符串10,十进制字符串255以二进制的形式表现则为0xff。

我们定义:

由二进制编码为十六进制的过程,称为十六进制



码;

由十六进制编码为二进制的过程,称为十六进制



码;

规则如下:

二进制数据:0x0a,在计算机中通常占1字节存储空间,即8bit,我们将前4bit取出,以十六进制表示,为字符串第一个字符:’0’;我们将后4bit取出,以十六进制表示,为字符串第二个字符:’a’,即,0000–>‘0’,1010–>’a’,最终结果为字符串”0a”。

若存在多个字节数据,则从左到右,依次编码。

例如:

0xab 0xcd 0xef 编码为十六进制:”abcdef”。

可见,编解码的本质是将数据以另一种不同形式表示的过程,数据信息本身并不发生改变。

如何将上面的解释“以程序代码的形式”进行“编码”?(^_^)





以上的文字包含了我此篇文章的信息,是以中英文形式表示,下面的代码,是将此篇文章的信息,以C程序的形式表示,这也是一种编解码



#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

/*--------------------------------------------------------------
 * 函数名称:bin2hex
 * 功能描述:对Binary数据以十六进制形式进行编码
 * 参数说明:bin:待编码数据;blen:待编码数据长度
 * 返 回 值:
 * 备    注:一字节数据0xab编码为字符串"ab"
 * */
void bin2hex(const unsigned char *bin, size_t blen)
{
    static char bin2char[] = "0123456789abcdef";
    char *hex = malloc(blen*2+1); // The Last '1' For C 'NULL'
    memset(hex, 0, blen*2+1);
    for (size_t i = 0; i < blen; i++)
    {
        hex[i*2] = bin2char[bin[i]>>4];
        hex[i*2+1] = bin2char[bin[i]&0x0f];
    }
    printf("%s\n", hex);
    free(hex);
}

/*--------------------------------------------------------------
 * 函数名称:hex2num
 * 功能描述:十六进制字符转换为十进制数字
 * 参数说明:ch:待转换十六进制字符
 * 返 回 值:转换后的十进制数字
 * 备    注:忽略错误
 * */
unsigned int hex2num(char ch)
{
    if (ch >= '0' && ch <= '9')
        return ch - '0';
    else if (ch >= 'a' && ch <= 'z')
        return ch - 'a';
    else if (ch >= 'A' && ch <= 'Z')
        return ch - 'A';
    else
        return 0; // error
}

/*--------------------------------------------------------------
 * 函数名称:hex2bin
 * 功能描述:十六进制形式解码为Binary数据
 * 参数说明:hex:待解码十六进制数据
 * 返 回 值:Binary数据
 * 备    注:可由Hex数据推导出Bin数据长度(Hex-Len = 2 * Bin-Len)
 * */
unsigned char *hex2bin(const char *hex)
{
    size_t blen = strlen(hex) / 2;
    unsigned char *bin = malloc(blen);
    for (size_t i = 0; i < blen; i++)
        bin[i] = hex2num(hex[i*2])*16 + hex2num(hex[i*2+1]);
    return bin;
}

int main()
{
    const char *hex = "0123456789abcdef";
    unsigned char *bin = hex2bin(hex);
    bin2hex(bin, 8);
    free(bin);
    return 0;
}

编译 && 执行:

[jiang@localhost jiang]$ gcc -o HexWithBin HexWithBin.c -std=c99
[jiang@localhost jiang]$ ./HexWithBin 
0123456789012345

请注意:

编解码的结果仅仅是数据表现形式不同,但结果所蕴含的信息数据是完全相同的。
编解码不等于加解密,更不等于摘要,他们三者是完全独立的概念,之间相互无任何关联性。



版权声明:本文为test1280原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。