Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Hasilkan CRC-32 untuk SDT kepada ts. dokumen

Hasilkan CRC-32 untuk SDT kepada ts. dokumen

PHPz
PHPzke hadapan
2024-02-10 20:20:071075semak imbas

为 SDT 到 ts 生成 CRC-32。文件

editor php Yuzai akan memperkenalkan kepada anda kaedah untuk menjana CRC-32 melalui SDT ke ts untuk mengesahkan integriti fail. CRC-32 ialah algoritma checksum yang biasa digunakan yang menghasilkan nilai semakan 32-bit dengan mengira data binari fail. Nilai semakan ini boleh digunakan untuk mengesahkan sama ada ralat atau rasuah berlaku semasa pemindahan atau penyimpanan fail. Menggunakan kaedah ini, kami boleh memastikan integriti fail dan meningkatkan kebolehpercayaan pemindahan data.

Kandungan soalan

Tugas saya ialah menangkap aliran video dari pelayan dan menulisnya ke ts. dokumen. Saya menghadapi masalah untuk menulis pakej SDT ke ts. Saya secara manual membentuk paket mengikut bait tetapi tidak tahu cara mengira CRC-32 daripada 4 bait pada penghujung SDT. (menggunakan golang)

Saya cuba mendapatkan CRC berdasarkan checksum data yang telah ditulis ke paket SDT, tetapi ia tidak berfungsi. Dalam SDT dihuraikan bait demi bait, CRC berbeza daripada apa yang saya kira.

Penyelesaian

Jika anda bercakap tentang mpeg-2, crc ditakrifkan sebagai:

width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0x00000000 check=0x0376e6e7 residue=0x00000000 name="crc-32/mpeg-2"
Terdapat contoh dalam

rfc 4326:

00 3f 86 dd 00 01 02 03 04 05 60 00 00 00 00 0d
3a 40 20 01 0d b8 30 08 19 65 00 00 00 00 00 00
00 01 20 01 0d b8 25 09 19 62 00 00 00 00 00 00
00 02 80 00 9d 8c 06 38 00 04 00 00 00 00 00 7c
17 17 63

Di mana empat bait terakhir ialah crc-32/mpeg-2 (dalam susunan big-endian) bagi semua bait yang mendahuluinya.

Berikut ialah contoh kod c untuk mengira crc:

#include <stddef.h>
#include <stdint.h>

uint32_t crc32mpeg2(uint32_t crc, void const *mem, size_t len) {
    unsigned char const *data = mem;
    if (data == NULL)
        return 0xffffffff;
    for (size_t i = 0; i < len; i++) {
        crc ^= (uint32_t)data[i] << 24;
        for (unsigned k = 0; k < 8; k++) {
            crc = crc & 0x80000000 ? (crc << 1) ^ 0x4c11db7 : crc << 1;
        }
    }
    return crc;
}

(Apabila mem等于null, kembalikan nilai crc awal.)

Atas ialah kandungan terperinci Hasilkan CRC-32 untuk SDT kepada ts. dokumen. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam