#include "BWT.h" #include #include // Inverse BWT void CalculateInverseBWT(uint32_t *transform,uint8_t *block,int blocklen) { int counts[256]={0},cumulativecounts[256]; for(int i=0;i(calloc(sizeof(int),256*256)); for(int i=0;i>3]|=1<<(x&7); } counts[byte]++; } total+=count; } for(int i=0;i<256;i++) array3[i]=0; int index=0; for(int i=0;i>24; } free(array2); } /*void UnsortBWTStuffItX(uint8_t *dest,int blocklen,int firstindex,uint8_t *src,uint32_t *transform) { int counts[256]={0}; for(int i=0;i=0;i--) { dest[i]=src[index]; index=transform[index]+counts[src[index]]; } }*/ // MTF Decoder void ResetMTFDecoder(MTFState *self) { for(int i=0;i<256;i++) self->table[i]=i; } int DecodeMTF(MTFState *self,int symbol) { int res=self->table[symbol]; for(int i=symbol;i>0;i--) self->table[i]=self->table[i-1]; self->table[0]=res; return res; } void DecodeMTFBlock(uint8_t *block,int blocklen) { MTFState mtf; ResetMTFDecoder(&mtf); for(int i=0;i=order) { int val=mtf.table[1]; mtf.table[1]=mtf.table[0]; mtf.table[0]=val; } } else { int val=mtf.table[symbol]; for(int i=symbol;i>1;i--) mtf.table[i]=mtf.table[i-1]; mtf.table[1]=val; } lasthead++; } }