void appendBitBuffer(struct EncodedData* result, const BitBuffer* data) { BitBuffer copy = *data; while (copy.num_bits >= sizeof(unsigned int) * 8) { encode_big_endian_integer(decode_integer(©, sizeof(unsigned int) * 8), sizeof(unsigned int) * 8, result); } if (copy.num_bits > 0) { encode_big_endian_integer(decode_integer(©, copy.num_bits), copy.num_bits, result); } }
void encode_little_endian_integer(unsigned int value, int num_bits, struct EncodedData* result) { int i; for (i = 0; i < num_bits / 8; ++i) { encode_big_endian_integer(value & 0xFF, 8, result); value >>= 8; } }
void encode_long_big_endian_integer(unsigned long long value, int num_bits, struct EncodedData* result) { if (num_bits > 32) { // Encode the highest four bytes num_bits -= 32; unsigned int upper = value >> num_bits; encode_big_endian_integer(upper, 32, result); value -= ((unsigned long long)upper) << num_bits; }
static void appendFloatBuffer(const unsigned char source[], int numBytes, enum Encoding encoding, struct EncodedData* output) { if (encoding == getMachineEncoding()) { int i; for (i = 0; i < numBytes; ++i) { encode_big_endian_integer(source[i], 8, output); } } else { int i; for (i = 0; i < numBytes; ++i) { encode_big_endian_integer(source[numBytes - 1 - i], 8, output); } } }