liba 0.1.15

An algorithm library based on C/C++
Documentation
#include "a/crc.h"

void a_crc8m_init(a_u8 table[0x100], a_u8 poly)
{
    for (unsigned int c = 0; c != 0x100; ++c)
    {
        unsigned int value = c;
        for (unsigned int b = 8; b; --b)
        {
            unsigned int sig = A_U8_C(0x80) & value;
            value <<= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = (a_u8)value;
    }
}
void a_crc8l_init(a_u8 table[0x100], a_u8 poly)
{
    poly = a_u8_rev(poly);
    for (unsigned int c = 0; c != 0x100; ++c)
    {
        unsigned int value = c;
        for (unsigned int b = 8; b; --b)
        {
            unsigned int sig = value & 1;
            value >>= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = (a_u8)value;
    }
}
a_u8 a_crc8(a_u8 const table[0x100], void const *pdata, a_size nbyte, a_u8 value)
{
    for (a_byte const *p = (a_byte const *)pdata; nbyte; --nbyte)
    {
        value = table[value ^ *p++];
    }
    return value;
}

void a_crc16m_init(a_u16 table[0x100], a_u16 poly)
{
    for (unsigned int c = 0; c != 0x100; ++c)
    {
        unsigned int value = c << 8;
        for (unsigned int b = 8; b; --b)
        {
            unsigned int sig = A_U16_C(0x8000) & value;
            value <<= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = (a_u16)value;
    }
}
void a_crc16l_init(a_u16 table[0x100], a_u16 poly)
{
    poly = a_u16_rev(poly);
    for (unsigned int c = 0; c != 0x100; ++c)
    {
        unsigned int value = c;
        for (unsigned int b = 8; b; --b)
        {
            unsigned int sig = value & 1;
            value >>= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = (a_u16)value;
    }
}
a_u16 a_crc16m(a_u16 const table[0x100], void const *pdata, a_size nbyte, a_u16 value)
{
    for (a_byte const *p = (a_byte const *)pdata; nbyte; --nbyte)
    {
        value = (a_u16)((value << 8) ^ table[((value >> 8) ^ *p++) & 0xFF]);
    }
    return value;
}
a_u16 a_crc16l(a_u16 const table[0x100], void const *pdata, a_size nbyte, a_u16 value)
{
    for (a_byte const *p = (a_byte const *)pdata; nbyte; --nbyte)
    {
        value = (a_u16)((value >> 8) ^ table[(value ^ *p++) & 0xFF]);
    }
    return value;
}

void a_crc32m_init(a_u32 table[0x100], a_u32 poly)
{
    for (a_u32 c = 0; c != 0x100; ++c)
    {
        a_u32 value = c << 24;
        for (unsigned int b = 8; b; --b)
        {
            a_u32 sig = A_U32_C(0x80000000) & value;
            value <<= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = value;
    }
}
void a_crc32l_init(a_u32 table[0x100], a_u32 poly)
{
    poly = a_u32_rev(poly);
    for (unsigned int c = 0; c != 0x100; ++c)
    {
        a_u32 value = c;
        for (unsigned int b = 8; b; --b)
        {
            a_u32 sig = value & 1;
            value >>= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = value;
    }
}
a_u32 a_crc32m(a_u32 const table[0x100], void const *pdata, a_size nbyte, a_u32 value)
{
    for (a_byte const *p = (a_byte const *)pdata; nbyte; --nbyte)
    {
        value = (value << 8) ^ table[((value >> 24) ^ *p++) & 0xFF];
    }
    return value;
}
a_u32 a_crc32l(a_u32 const table[0x100], void const *pdata, a_size nbyte, a_u32 value)
{
    for (a_byte const *p = (a_byte const *)pdata; nbyte; --nbyte)
    {
        value = (value >> 8) ^ table[(value ^ *p++) & 0xFF];
    }
    return value;
}

void a_crc64m_init(a_u64 table[0x100], a_u64 poly)
{
    for (a_u64 c = 0; c != 0x100; ++c)
    {
        a_u64 value = c << 56;
        for (unsigned int b = 8; b; --b)
        {
            a_u64 sig = A_U64_C(0x8000000000000000) & value;
            value <<= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = value;
    }
}
void a_crc64l_init(a_u64 table[0x100], a_u64 poly)
{
    poly = a_u64_rev(poly);
    for (unsigned int c = 0; c != 0x100; ++c)
    {
        a_u64 value = c;
        for (unsigned int b = 8; b; --b)
        {
            a_u64 sig = value & 1;
            value >>= 1;
            if (sig) { value ^= poly; }
        }
        table[c] = value;
    }
}
a_u64 a_crc64m(a_u64 const table[0x100], void const *pdata, a_size nbyte, a_u64 value)
{
    for (a_byte const *p = (a_byte const *)pdata; nbyte; --nbyte)
    {
        value = (value << 8) ^ table[((value >> 56) ^ *p++) & 0xFF];
    }
    return value;
}
a_u64 a_crc64l(a_u64 const table[0x100], void const *pdata, a_size nbyte, a_u64 value)
{
    for (a_byte const *p = (a_byte const *)pdata; nbyte; --nbyte)
    {
        value = (value >> 8) ^ table[(value ^ *p++) & 0xFF];
    }
    return value;
}