Hex编码与解码

来源:互联网 发布:listview怎么添加数据 编辑:程序博客网 时间:2024/05/02 04:26

一、Hex编码简介

Hex 全称 是Intel HEX。Hex文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。

那么Hex编码是什么呢?就是将数据转化成符合Intel HEX文件中的数据格式的编码方式。举一个简单的例子,如下:

99、105、224,7

编码之后的数据为:“6369e007”,是一个字符串。

二、Hex编码与解码实现

[cpp] view plaincopy
  1. static const char hex_table_uc[16] = { '0''1''2''3',  
  2.                                        '4''5''6''7',  
  3.                                        '8''9''A''B',  
  4.                                        'C''D''E''F' };  
  5. static const char hex_table_lc[16] = { '0''1''2''3',  
  6.                                        '4''5''6''7',  
  7.                                        '8''9''a''b',  
  8.                                        'c''d''e''f' };  
  9.   
  10. char *encodeToHex(char *buff, const uint8_t *src, int len, int type) {  
  11.     int i;  
  12.   
  13.     const char *hex_table = type ? hex_table_lc : hex_table_uc;  
  14.   
  15.     for(i = 0; i < len; i++) {  
  16.         buff[i * 2]     = hex_table[src[i] >> 4];  
  17.         buff[i * 2 + 1] = hex_table[src[i] & 0xF];  
  18.     }  
  19.   
  20.     buff[2 * len] = '\0';  
  21.      
  22.     return buff;  
  23. }  
  24.   
  25. uint8_t *decodeFromHex(uint8_t *data, const char *src, int len) {  
  26.     size_t outLen = len / 2;  
  27.   
  28.     uint8_t *out = data;  
  29.   
  30.     uint8_t accum = 0;  
  31.     for (size_t i = 0; i < len; ++i) {  
  32.         char c = src[i];  
  33.         unsigned value;  
  34.         if (c >= '0' && c <= '9') {  
  35.             value = c - '0';  
  36.         } else if (c >= 'a' && c <= 'f') {  
  37.             value = c - 'a' + 10;  
  38.         } else if (c >= 'A' && c <= 'F') {  
  39.             value = c - 'A' + 10;  
  40.         } else {  
  41.             return NULL;  
  42.         }  
  43.   
  44.         accum = (accum << 4) | value;  
  45.   
  46.         if (i & 1) {  
  47.             *out++ = accum;  
  48.             accum = 0;  
  49.         }  
  50.     }  
  51.   
  52.     return data;  
  53. }  
0 0
原创粉丝点击