00001 #include "Base16.h"
00002
00003 namespace oasys {
00004
00005
00006 size_t
00007 Base16::encode(const u_int8_t* in, size_t in_len, u_int8_t* out16, size_t out16_len)
00008 {
00009 const u_int8_t* encoding = reinterpret_cast<const u_int8_t*>("0123456789ABCDEF");
00010
00011 if (in_len * 2 > out16_len)
00012 {
00013 in_len = out16_len/2;
00014 }
00015
00016 size_t i;
00017 for (i=0; i<in_len; ++i)
00018 {
00019 out16[2*i] = encoding[in[i] & 0xF];
00020 out16[2*i + 1] = encoding[(in[i] >> 4) & 0xF];
00021 }
00022 return i;
00023 }
00024
00025
00026 size_t
00027 Base16::decode(const u_int8_t* in16, size_t in16_len, u_int8_t* out, size_t out_len)
00028 {
00029 if (in16_len/2 > out_len)
00030 {
00031 in16_len = out_len * 2;
00032 }
00033
00034 size_t i;
00035 for (i=0; i<in16_len; i+=2)
00036 {
00037 u_int8_t lower = (in16[i] <= '9') ? (in16[i] - '0') : (in16[i] - 'A' + 10);
00038 u_int8_t upper = (in16[i+1] <= '9') ? (in16[i+1] - '0') :
00039 (in16[i+1] - 'A' + 10);
00040 out[i/2] = lower | (upper << 4);
00041 }
00042
00043 return i/2;
00044 }
00045
00046 }