From: Geoffrey Allott Date: Sat, 3 Sep 2022 17:33:48 +0000 (+0100) Subject: encode bits and x together instead of len and bits X-Git-Url: https://git.pointlesshacks.com/?a=commitdiff_plain;h=80c740c6bc4f462e9f9a8de884880f30c7186234;p=tANS.git encode bits and x together instead of len and bits --- diff --git a/src/tANS.c b/src/tANS.c index 0a24c8a..ea6a03b 100644 --- a/src/tANS.c +++ b/src/tANS.c @@ -215,7 +215,8 @@ fail: static int tANS_compress_file(FILE* input, FILE *output) { - uint32_t i, len, bits, count, len_and_bits; + uint32_t i, len, bits, count, bits_and_x; + uint16_t u16_len; uint8_t *read_buf; uint8_t *write_buf; double p[N_AUX][N_SYMBOLS] = {0}; @@ -263,9 +264,10 @@ static int tANS_compress_file(FILE* input, FILE *output) st->x += read_buf[len-1]; bits = tANS_rl_encode(st, read_buf, len - 1, write_buf); - len_and_bits = (len - 1) | (bits << 14); - if (fwrite(&len_and_bits, sizeof len_and_bits, 1, output) != 1) goto fail; - if (fwrite(&st->x, sizeof st->x, 1, output) != 1) goto fail; + u16_len = (uint16_t) (len - 1); + bits_and_x = (st->x & ((1 << LOG2_TBLSZ) - 1)) | (bits << LOG2_TBLSZ); + if (fwrite(&u16_len, sizeof u16_len, 1, output) != 1) goto fail; + if (fwrite(&bits_and_x, sizeof bits_and_x, 1, output) != 1) goto fail; if (fwrite(write_buf, (bits + 7) / 8, 1, output) != 1) goto fail; memset(write_buf, 0, (bits + 7) / 8); @@ -294,7 +296,8 @@ fail: static int tANS_decompress_file(FILE* input, FILE *output) { - uint32_t i, len, bits, count, len_and_bits; + uint32_t i, len, bits, count, bits_and_x; + uint16_t u16_len; uint8_t *read_buf; uint8_t *write_buf; double p[N_AUX][N_SYMBOLS] = {0}; @@ -325,12 +328,12 @@ static int tANS_decompress_file(FILE* input, FILE *output) } tANS_rl_decode_st_init(st, symbol_tbls); - if (fread(&len_and_bits, sizeof len_and_bits, 1, input) != 1) break; - len = (len_and_bits & ((1 << 14) - 1)) + 1; - bits = len_and_bits >> 14; - if (fread(&st->x, sizeof st->x, 1, input) != 1) goto fail; + if (fread(&u16_len, sizeof u16_len, 1, input) != 1) break; + if (fread(&bits_and_x, sizeof bits_and_x, 1, input) != 1) goto fail; + len = (uint32_t) u16_len + 1; + bits = bits_and_x >> LOG2_TBLSZ; + st->x = bits_and_x & ((1 << LOG2_TBLSZ) - 1); if (fread(read_buf + 4, (bits + 7) / 8, 1, input) != 1) goto fail; - st->x &= symbol_tbls[0].tblsz - 1; bits = tANS_rl_decode(st, write_buf, len - 1, read_buf + 4, bits); if (bits != 0) { fprintf(stderr, "tANS: corrupted file\n");