www.pudn.com > DCPlusPlus-src.zip > Encoder.cpp


#include "stdinc.h" 
#include "DCPlusPlus.h" 
 
#include "Encoder.h" 
 
const int8_t Encoder::base32Table[] = { 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,26,27,28,29,30,31,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, 
	15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, 
	-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, 
	15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
}; 
 
const char Encoder::base32Alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; 
 
string& Encoder::toBase32(const u_int8_t* src, size_t len, string& dst) { 
	// Code snagged from the bitzi bitcollider 
	size_t i, index; 
	u_int8_t word; 
	dst.reserve(((len * 8) / 5) + 1); 
 
	for(i = 0, index = 0; i < len;) { 
		/* Is the current word going to span a byte boundary? */ 
		if (index > 3) { 
			word = (u_int8_t)(src[i] & (0xFF >> index)); 
			index = (index + 5) % 8; 
			word <<= index; 
			if ((i + 1) < len) 
				word |= src[i + 1] >> (8 - index); 
 
			i++; 
		} else { 
			word = (u_int8_t)(src[i] >> (8 - (index + 5))) & 0x1F; 
			index = (index + 5) % 8; 
			if (index == 0) 
				i++; 
		} 
 
		dcassert(word < 32); 
		dst += base32Alphabet[word]; 
	} 
	return dst; 
} 
 
void Encoder::fromBase32(const char* src, u_int8_t* dst, size_t len) { 
	size_t i, index, offset; 
 
	memset(dst, 0, len); 
	for(i = 0, index = 0, offset = 0; src[i]; i++) { 
		// Skip what we don't recognise 
		int8_t tmp = base32Table[(unsigned char)src[i]]; 
 
		if(tmp == -1) 
			continue; 
 
		if (index <= 3) { 
			index = (index + 5) % 8; 
			if (index == 0) { 
				dst[offset] |= tmp; 
				offset++; 
				if(offset == len) 
					break; 
			} else { 
				dst[offset] |= tmp << (8 - index); 
			} 
		} else { 
			index = (index + 5) % 8; 
			dst[offset] |= (tmp >> index); 
			offset++; 
			if(offset == len) 
				break; 
			dst[offset] |= tmp << (8 - index); 
		} 
	} 
} 
 
/** 
 * @file 
 * $Id: Encoder.cpp,v 1.5 2004/07/26 20:01:20 arnetheduck Exp $ 
 */