Рекомендуемые инструменты
Калькулятор контрольной суммы CRC-16
Калькулятор циклической проверки избыточности CRC-16, поддерживающий несколько алгоритмов CRC-16
Нужен CRC-8 или CRC-32? Открыть общий CRC-калькулятор
Обзор инструмента: Калькулятор контрольной суммы CRC-16
CRC-16 (16-битная циклическая проверка избыточности) - это широко используемый алгоритм обнаружения ошибок, в основном используемый для проверки целостности при передаче и хранении данных. Этот инструмент поддерживает несколько вариантов алгоритмов CRC-16, подходящих для различных сценариев применения.
Что такое Калькулятор контрольной суммы CRC-16
Калькулятор контрольной суммы CRC-16 кодирует/декодирует данные или генерирует контрольные суммы.
Как пользоваться
- Вставьте содержимое или введите текст.
- Выберите режим кодирования или хеша.
- Скопируйте результат.
Частые сценарии
- Подписи и проверка целостности
- Безопасная передача между системами
- Быстрая проверка при отладке
❓ Частые вопросы
В1: Разные результаты для одного ввода?
О: Проверьте кодировку и скрытые символы.
В2: Можно ли обратимо?
О: Кодирование обратимо, хеш — нет.
В3: Большой ввод?
О: Разбейте на части для стабильности.
🔧 Поддерживаемые алгоритмы
CRC-16 Standard
- Полином: 0x8005 (x^16 + x^15 + x^2 + 1)
- Начальное значение: 0x0000
- Применение: Общая проверка данных
CRC-16 CCITT
- Полином: 0x1021 (x^16 + x^12 + x^5 + 1)
- Начальное значение: 0xFFFF
- Применение: Протоколы связи, X.25, HDLC
CRC-16 Modbus
- Полином: 0x8005
- Начальное значение: 0xFFFF
- Применение: Протокол связи Modbus
CRC-16 XMODEM
- Полином: 0x1021
- Начальное значение: 0x0000
- Применение: Протокол передачи файлов XMODEM
💡 Случаи использования
1. Проверка целостности данных
// Проверка целостности передачи данных
class DataIntegrityChecker {
constructor() {
this.checksums = new Map();
}
// Вычислить и сохранить контрольную сумму CRC-16 для данных
storeChecksum(dataId, data) {
const crc16 = this.calculateCRC16(data, 'crc16');
this.checksums.set(dataId, crc16);
return crc16;
}
// Проверить целостность данных
verifyIntegrity(dataId, currentData) {
const originalCRC = this.checksums.get(dataId);
if (!originalCRC) {
return { valid: false, reason: 'Исходная контрольная сумма не найдена' };
}
const currentCRC = this.calculateCRC16(currentData, 'crc16');
const isValid = originalCRC === currentCRC;
return {
valid: isValid,
originalCRC: '0x' + originalCRC.toString(16).toUpperCase(),
currentCRC: '0x' + currentCRC.toString(16).toUpperCase(),
reason: isValid ? 'Данные целы' : 'Данные были изменены'
};
}
calculateCRC16(data, algorithm) {
// Использовать профессиональную библиотеку CRC в реальной реализации
return this.crcCalculate(data, algorithm);
}
}
// Пример использования
const checker = new DataIntegrityChecker();
// Сохранить контрольную сумму для исходных данных
const originalData = "Важные бизнес-данные";
const checksum = checker.storeChecksum('data001', originalData);
console.log('Сохраненная контрольная сумма:', checksum);
// Проверить целостность данных
const currentData = "Важные бизнес-данные"; // Не изменены
const verification = checker.verifyIntegrity('data001', currentData);
console.log('Результат проверки целостности:', verification);
2. Реализация протокола связи
// Проверка CRC протокола связи Modbus
class ModbusProtocol {
constructor() {
this.crcTable = this.generateCRCTable(0x8005);
}
// Генерировать таблицу поиска CRC
generateCRCTable(polynomial) {
const table = [];
for (let i = 0; i < 256; i++) {
let crc = i;
for (let j = 0; j < 8; j++) {
if (crc & 1) {
crc = (crc >>> 1) ^ polynomial;
} else {
crc = crc >>> 1;
}
}
table[i] = crc & 0xFFFF;
}
return table;
}
// Вычислить Modbus CRC-16
calculateModbusCRC(data) {
let crc = 0xFFFF;
const bytes = typeof data === 'string' ?
new TextEncoder().encode(data) : data;
for (const byte of bytes) {
const tableIndex = (crc ^ byte) & 0xFF;
crc = ((crc >>> 8) ^ this.crcTable[tableIndex]) & 0xFFFF;
}
return crc;
}
// Создать кадр сообщения Modbus
createFrame(deviceId, functionCode, data) {
const frame = [deviceId, functionCode, ...data];
const crc = this.calculateModbusCRC(new Uint8Array(frame));
// Добавить CRC в формате little-endian в конец кадра
frame.push(crc & 0xFF);
frame.push((crc >>> 8) & 0xFF);
return new Uint8Array(frame);
}
// Проверить кадр сообщения Modbus
verifyFrame(frame) {
if (frame.length < 4) {
return { valid: false, reason: 'Недостаточная длина кадра' };
}
const dataLength = frame.length - 2;
const data = frame.slice(0, dataLength);
const receivedCRC = frame[dataLength] | (frame[dataLength + 1] << 8);
const calculatedCRC = this.calculateModbusCRC(data);
return {
valid: receivedCRC === calculatedCRC,
receivedCRC: '0x' + receivedCRC.toString(16).toUpperCase(),
calculatedCRC: '0x' + calculatedCRC.toString(16).toUpperCase(),
reason: receivedCRC === calculatedCRC ? 'Проверка CRC прошла успешно' : 'Проверка CRC не удалась'
};
}
}
// Пример использования
const modbus = new ModbusProtocol();
// Создать кадр запроса чтения удерживающих регистров
const frame = modbus.createFrame(0x01, 0x03, [0x00, 0x00, 0x00, 0x02]);
console.log('Кадр Modbus:', Array.from(frame).map(b => '0x' + b.toString(16).toUpperCase()));
// Проверить полученный кадр
const verification = modbus.verifyFrame(frame);
console.log('Результат проверки кадра:', verification);
🔍 Характеристики алгоритма
Преимущества
- Быстрое вычисление: Быстрее алгоритмов MD5, SHA
- Совместимость с аппаратурой: Легко реализуется в аппаратуре
- Стандартизированный: Доступны несколько стандартных алгоритмов
- Реальное время: Подходит для проверки данных в реальном времени
Ограничения
- Безопасность: Не подходит для криптографической безопасности
- Коллизии: Разные данные могут иметь одинаковую контрольную сумму
- Длина: 16-битная контрольная сумма относительно короткая
⚠️ Рекомендации по использованию
- Выбор алгоритма: Выбрать подходящий вариант CRC-16 на основе конкретного протокола
- Оптимизация производительности: Использовать таблицы поиска для повышения эффективности вычислений
- Обработка ошибок: Реализовать комплексное обнаружение и обработку ошибок
- Проверка тестирования: Использовать стандартные тестовые векторы для проверки правильности реализации
📚 Технические справочники
- ITU-T V.41: Стандарт CCITT CRC-16
- Спецификация Modbus: Реализация Modbus CRC-16
- RFC 1662: Использование CRC-16 в PPP
- ISO 3309: Стандарт CRC в HDLC