C语言十六进制编码(BASE16)的编码与解码
十六进制(BASE16)编码
- 将数据以4位二进制为一组进行编码,就是BASE16编码。
- 2的4次方是16,4位二进制数可以表示16个字符,简单的说,BASE16编码,就是用16个字符,即:0-9, A-F来表示四位二进制数!!!
- 用字符数组定义一个码表:static char bt[16] = “0123456789ABCDEF”;
- 一个字节是八位二进制数,正好可以用两个字符表示,也就是一个字符变成两个十六进制字符!
- 编码函数base16_encode,参数为输入的正常字符串指针,输出为字符串指针,用malloc分配内存,长度为原字符串长度的2倍加1,因为字符串结尾为0!!!
- 先取字符的前四位(从左边开始),即右移四位,以这四位为索引,从码表中取出一个字符,将字符保存到分配好的内存中!!!
- 再取字符的后四位,此时要将字符的前四位去掉,用位运符&,即按位与,前四位每一位都做与0运算,其结果均为0,后四位每一位都做与1运算,则完成保留后四位不变!!!
- 按位与00001111,也就是 &0X0F,然后再以结果为索引,从码表中取出字符,将字符保存到分配好的内存中,如此即完成编码操作!!!
- 输出的字符串指针是用malloc分配的内存,用完后一定要用free释放掉!!!
代码如下:
/* filename: base16.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**/
static char bt[16] = "0123456789ABCDEF";
/**/
char *
base16_encode (char *txt)
{
int i = 0, j = 0, len = strlen (txt);
char *buf = (char*) malloc (len * 2 + 1);
memset (buf, 0, len*2+1);
while (i < len)
{
char c = txt[i];
unsigned char ia = c >> 4;
char sa = bt[ia];
unsigned char ib = c & 0x0F;
char sb = bt[ib];
buf[j] = sa; j++;
buf[j] = sb; j++;
i++;
}
return buf;
}
/**/
void
test_base16_encode (void)
{
char *str = "Hello world!";
char *code = base16_encode (str);
printf ("Source : [%s]\n", str);
printf ("Dest : [%s]\n", code);
free (code);
}
/**/
int
main (int argc, char *argv[])
{
test_base16_encode ();
return 0;
}
/* --(.^.)-- */
编译运行,结果如下:
songvm@ubuntu:~/works/xdn/woo$ gcc base16.c -o base16
songvm@ubuntu:~/works/xdn/woo$ ./base16
Source : [Hello world!]
Dest : [48656C6C6F20776F726C6421]
songvm@ubuntu:~/works/xdn/woo$
解码函数base16_decode
- 将上面的编码字符串复制到代码中,准备解码,验证一下!
- 定义函数base16_get_index,取编码字符,对照码表获得索引!
- 定义解码函数base16_decode,循环每次取两个索引,将两个索引合并成一个字符!
- 编码右移,解码左移即可!!!
- 同样要分配内存,用完后注意释放内存指针!!!
- 将字符保存到内存指针中
代码如下:
/* filename: base16.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**/
static char bt[16] = "0123456789ABCDEF";
/**/
char *
base16_encode (char *txt)
{
int i = 0, j = 0, len = strlen (txt);
char *buf = (char*) malloc (len * 2 + 1);
memset (buf, 0, len*2+1);
while (i < len)
{
char c = txt[i];
unsigned char ia = c >> 4;
char sa = bt[ia];
unsigned char ib = c & 0x0F;
char sb = bt[ib];
buf[j] = sa; j++;
buf[j