LINUX.ORG.RU

История изменений

Исправление aol, (текущая версия) :

CCITT

есть несколько вариаций:

        case CCITT_0xFFFF:
            return crc(nBytes, straight_8, straight_16, 0xffff, 0x1021);
        case CCITT_0x0000_AKA_XMODEM:
            return crc(nBytes, straight_8, straight_16, 0x0000, 0x1021);
        case CCITT_KERMIT:
            return crc(nBytes, reverse_8, reverse_16, 0xffff, 0x1021);
        case CCIT_0x1D0F:
            return crc(nBytes, straight_8, straight_16, 0x1d0f, 0x1021);

весь код привести не могу, вот куски, чтобы получилось рассчитать:

typedef uint8_t bit_order_8(uint8_t value);
typedef uint16_t bit_order_16(uint16_t value);

uint16_t straight_16(uint16_t value) {
    return value;
}

uint16_t reverse_16(uint16_t value) {
    uint16_t reversed = 0;
    for (int i = 0; i < 16; ++i) {
        reversed <<= 1;
        reversed |= value & 0x1;
        value >>= 1;
    }
    return reversed;
}

uint8_t straight_8(uint8_t value) {
    return value;
}

uint8_t reverse_8(uint8_t value) {
    uint8_t reversed = 0;
    for (int i = 0; i < 8; ++i) {
        reversed <<= 1;
        reversed |= value & 0x1;
        value >>= 1;
    }
    return reversed;
}

uint16_t crc(int nBytes, bit_order_8 dataBitOrder, bit_order_16 remainderBitOrder,
        uint16_t initial, uint16_t polynomial) {
    uint16_t crc = initial;
    for (int byte = 0; byte < nBytes; byte++) {
        crc ^= (dataBitOrder(rawBuffer[byte]) << 8);
        for (uint8_t bit = 8; bit > 0; --bit) {
            if (crc & 0x8000) {
                crc = (crc << 1) ^ polynomial;
            } else {
                crc = (crc << 1);
            }
        }
    }
    return remainderBitOrder(crc);
}

//твою документацию я, естественно, не читал. :) в моем примере - nBytes - размер данных, от которых надо посчитать КС, сами данные в rawBuffer.

Исходная версия aol, :

CCITT

есть несколько вариаций:

        case CCITT_0xFFFF:
            return crc(nBytes, straight_8, straight_16, 0xffff, 0x1021);
        case CCITT_0x0000_AKA_XMODEM:
            return crc(nBytes, straight_8, straight_16, 0x0000, 0x1021);
        case CCITT_KERMIT:
            return crc(nBytes, reverse_8, reverse_16, 0xffff, 0x1021);
        case CCIT_0x1D0F:
            return crc(nBytes, straight_8, straight_16, 0x1d0f, 0x1021);

весь код привести не могу, вот куски, чтобы получилось рассчитать:

typedef uint8_t bit_order_8(uint8_t value);
typedef uint16_t bit_order_16(uint16_t value);

uint16_t straight_16(uint16_t value) {
    return value;
}

uint16_t reverse_16(uint16_t value) {
    uint16_t reversed = 0;
    for (int i = 0; i < 16; ++i) {
        reversed <<= 1;
        reversed |= value & 0x1;
        value >>= 1;
    }
    return reversed;
}

uint8_t straight_8(uint8_t value) {
    return value;
}

uint8_t reverse_8(uint8_t value) {
    uint8_t reversed = 0;
    for (int i = 0; i < 8; ++i) {
        reversed <<= 1;
        reversed |= value & 0x1;
        value >>= 1;
    }
    return reversed;
}

uint16_t crc(int nBytes, bit_order_8 dataBitOrder, bit_order_16 remainderBitOrder,
        uint16_t initial, uint16_t polynomial) {
    uint16_t crc = initial;
    for (int byte = 0; byte < nBytes; byte++) {
        crc ^= (dataBitOrder(rawBuffer[byte]) << 8);
        for (uint8_t bit = 8; bit > 0; --bit) {
            if (crc & 0x8000) {
                crc = (crc << 1) ^ polynomial;
            } else {
                crc = (crc << 1);
            }
        }
    }
    return remainderBitOrder(crc);
}