Калькулятор контрольной суммы 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. Скопируйте результат.

Частые сценарии

  • Подписи и проверка целостности
  • Безопасная передача между системами
  • Быстрая проверка при отладке

❓ Частые вопросы

В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-битная контрольная сумма относительно короткая

⚠️ Рекомендации по использованию

  1. Выбор алгоритма: Выбрать подходящий вариант CRC-16 на основе конкретного протокола
  2. Оптимизация производительности: Использовать таблицы поиска для повышения эффективности вычислений
  3. Обработка ошибок: Реализовать комплексное обнаружение и обработку ошибок
  4. Проверка тестирования: Использовать стандартные тестовые векторы для проверки правильности реализации

📚 Технические справочники

  • ITU-T V.41: Стандарт CCITT CRC-16
  • Спецификация Modbus: Реализация Modbus CRC-16
  • RFC 1662: Использование CRC-16 в PPP
  • ISO 3309: Стандарт CRC в HDLC