00001 #ifndef Impala_Util_BinHex_h
00002 #define Impala_Util_BinHex_h
00003
00004 #include "Basis/String.h"
00005 #include "Basis/NativeTypes.h"
00006
00007 namespace Impala
00008 {
00009 namespace Util
00010 {
00011
00012
00013 inline String
00014 Bin2Hex(UInt8* data, size_t dataSize)
00015 {
00016 const char lookup[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
00017 'A', 'B', 'C', 'D', 'E', 'F'};
00018
00019 String res;
00020 for (size_t i=0 ; i<dataSize ; i++)
00021 {
00022 Int8 hi = (data[i] & 0xF0) >> 4;
00023 Int8 lo = data[i] & 0x0F;
00024 res += lookup[hi];
00025 res += lookup[lo];
00026 }
00027 return res;
00028 }
00029
00030 inline UInt8*
00031 Hex2Bin(CString data, size_t& resSize)
00032 {
00033 UInt8* tmp = new UInt8[data.size()];
00034 for (int i=0 ; i<data.size() ; i++)
00035 {
00036 UInt8 res;
00037 switch (data[i])
00038 {
00039 case '0': res = 0; break;
00040 case '1': res = 1; break;
00041 case '2': res = 2; break;
00042 case '3': res = 3; break;
00043 case '4': res = 4; break;
00044 case '5': res = 5; break;
00045 case '6': res = 6; break;
00046 case '7': res = 7; break;
00047 case '8': res = 8; break;
00048 case '9': res = 9; break;
00049 case 'A': res = 10; break;
00050 case 'B': res = 11; break;
00051 case 'C': res = 12; break;
00052 case 'D': res = 13; break;
00053 case 'E': res = 14; break;
00054 case 'F': res = 15; break;
00055 }
00056 tmp[i] = res;
00057 }
00058 resSize = data.size() / 2;
00059 UInt8* res = new UInt8[resSize];
00060 for (int i=0 ; i<resSize ; i++)
00061 {
00062 res[i] = ((tmp[i*2] << 4) & 0xF0) | tmp[i*2+1];
00063 }
00064 delete tmp;
00065 return res;
00066 }
00067
00068 }
00069 }
00070
00071 #endif