【C语言十六进制编码(BASE16)的编码与解码】

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值