1
0
forked from 0ad/0ad

# fix to base32 (was interpreting length incorrectly)

This was SVN commit r4704.
This commit is contained in:
janwas 2006-12-18 22:15:20 +00:00
parent 84260057f9
commit 64d56aadf8
2 changed files with 19 additions and 8 deletions

View File

@ -334,24 +334,27 @@ u16 fp_to_u16(double in)
// string processing
// big endian!
void base32(const size_t len, const u8* in, u8* out)
void base32(const size_t in_len, const u8* in, u8* out)
{
u32 pool = 0; // of bits from buffer
uint bits = 0; // # bits currently in buffer
uint pool_bits = 0; // # bits currently in buffer
static const u8 tbl[33] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
for(size_t i = 0; i < len; i++)
size_t in_bytes_left = in_len; // to avoid overrunning input buffer
const size_t out_chars = (in_len*8 + 4) / 5; // = ceil(# 5-bit blocks)
for(size_t i = 0; i < out_chars; i++)
{
if(bits < 5)
if(pool_bits < 5 && in_bytes_left)
{
pool <<= 8;
pool |= *in++;
bits += 8;
pool_bits += 8;
in_bytes_left--;
}
bits -= 5;
uint c = (pool >> bits) & 31;
pool_bits -= 5;
const uint c = (pool >> pool_bits) & 31;
*out++ = tbl[c];
}

View File

@ -2,6 +2,14 @@
#include "lib/lib.h"
extern "C"
int
__stdcall
MessageBoxA(
void*,
const char*,const char*,
unsigned int);
class TestLib : public CxxTest::TestSuite
{
public:
@ -196,7 +204,7 @@ public:
const u8 in[] = { 0x12, 0x57, 0x85, 0xA2, 0xF9, 0x41, 0xCD, 0x57, 0xF3 };
u8 out[20] = {0};
base32(ARRAY_SIZE(in), in, out);
const u8 correct_out[] = "CJLYLIXZI";
const u8 correct_out[] = "CJLYLIXZIHGVP4C";
TS_ASSERT_SAME_DATA(out, correct_out, ARRAY_SIZE(correct_out));
}