Maison  >  Article  >  développement back-end  >  Générez CRC-32 pour SDT en ts. document

Générez CRC-32 pour SDT en ts. document

PHPz
PHPzavant
2024-02-10 20:20:071075parcourir

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

l'éditeur php Yuzai vous présentera une méthode pour générer CRC-32 via SDT vers ts pour vérifier l'intégrité du fichier. CRC-32 est un algorithme de somme de contrôle couramment utilisé qui génère une valeur de contrôle de 32 bits en calculant les données binaires du fichier. Cette valeur de contrôle peut être utilisée pour vérifier si des erreurs ou une corruption se sont produites lors du transfert ou du stockage de fichiers. Grâce à cette méthode, nous pouvons garantir l’intégrité des fichiers et améliorer la fiabilité du transfert de données.

Contenu de la question

Ma tâche est de capturer le flux vidéo du serveur et de l'écrire sur ts. document. J'ai du mal à essayer d'écrire un package SDT sur ts. Je forme manuellement le paquet par octets mais je ne sais pas comment calculer le CRC-32 des 4 octets à la fin du SDT. (en utilisant Golang)

J'ai essayé d'obtenir le CRC basé sur la somme de contrôle des données qui ont été écrites dans le paquet SDT, mais cela ne fonctionne pas. Dans le SDT analysé octet par octet, le CRC est différent de ce que j'ai calculé.

Solution

Si vous parlez de mpeg-2, crc est défini comme :

width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0x00000000 check=0x0376e6e7 residue=0x00000000 name="crc-32/mpeg-2"
Il y a un exemple dans

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

Où les quatre derniers octets sont le crc-32/mpeg-2 (dans l'ordre big-endian) de tous les octets qui le précèdent.

Voici un exemple de code C pour calculer le 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;
}

(Quand mem等于null, renvoie la valeur crc initiale.)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer