编解码:十六进制编解码
信息有多种表现形式:二进制、十进制、十六进制、字符串…
在计算机中,信息是以二进制的形式来表现。
可以人为定义: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
请注意:
编解码的结果仅仅是数据表现形式不同,但结果所蕴含的信息数据是完全相同的。
编解码不等于加解密,更不等于摘要,他们三者是完全独立的概念,之间相互无任何关联性。