Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

wvhex.cc

Go to the documentation of this file.
00001 /* 00002 * Worldvisions Weaver Software: 00003 * Copyright (C) 1997-2002 Net Integration Technologies, Inc. 00004 * 00005 * Hex encoder and decoder. 00006 */ 00007 #include "wvhex.h" 00008 #include <ctype.h> 00009 00010 static inline char tohex(int digit, char alphabase) 00011 { 00012 return (digit < 10 ? '0' : alphabase) + digit; 00013 } 00014 00015 static inline int fromhex(char digit) 00016 { 00017 if (isdigit(digit)) 00018 return digit - '0'; 00019 if (isupper(digit)) 00020 return digit - 'A' + 10; 00021 return digit - 'a' + 10; 00022 } 00023 00024 /***** WvHexEncoder *****/ 00025 00026 WvHexEncoder::WvHexEncoder(bool use_uppercase) 00027 { 00028 alphabase = (use_uppercase ? 'A' : 'a') - 10; 00029 _reset(); 00030 } 00031 00032 00033 bool WvHexEncoder::_reset() 00034 { 00035 return true; 00036 } 00037 00038 00039 bool WvHexEncoder::_encode(WvBuf &in, WvBuf &out, bool flush) 00040 { 00041 while (in.used() != 0) 00042 { 00043 unsigned char byte = in.getch(); 00044 out.putch(tohex(byte >> 4, alphabase)); 00045 out.putch(tohex(byte & 15, alphabase)); 00046 } 00047 return true; 00048 } 00049 00050 00051 /***** WvHexDecoder *****/ 00052 00053 WvHexDecoder::WvHexDecoder() 00054 { 00055 _reset(); 00056 } 00057 00058 00059 bool WvHexDecoder::_reset() 00060 { 00061 issecond = false; 00062 first = 0; 00063 return true; 00064 } 00065 00066 00067 bool WvHexDecoder::_encode(WvBuf &in, WvBuf &out, bool flush) 00068 { 00069 while (in.used() != 0) 00070 { 00071 char ch = (char) in.getch(); 00072 if (isxdigit(ch)) 00073 { 00074 int digit = fromhex(ch); 00075 if ( (issecond = ! issecond) ) 00076 first = digit; 00077 else 00078 out.putch(first << 4 | digit); 00079 continue; 00080 } 00081 if (isspace(ch)) 00082 continue; 00083 seterror("invalid character '%s' in hex input", ch); 00084 return false; 00085 } 00086 if (flush && issecond) 00087 return false; // not enough hex digits supplied 00088 return true; 00089 } 00090 00091 00092 /*** Compatibility ***/ 00093 00094 void hexify(char *obuf, const void *ibuf, size_t len) 00095 { 00096 size_t outlen = len * 2 + 1; 00097 WvHexEncoder(false /*use_uppercase*/). 00098 flushmemmem(ibuf, len, obuf, & outlen); 00099 obuf[outlen] = '\0'; 00100 } 00101 00102 00103 void unhexify(void *obuf, const char *ibuf) 00104 { 00105 size_t inlen = strlen(ibuf); 00106 size_t outlen = inlen / 2; 00107 WvHexDecoder().flushmemmem(ibuf, inlen, obuf, & outlen); 00108 }

Generated on Tue Oct 5 01:09:20 2004 for WvStreams by doxygen 1.3.7