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

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

PHPz
Libérer: 2024-02-10 20:20:07
avant
1119 Les gens l'ont consulté

为 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"
Copier après la connexion
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
Copier après la connexion

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;
}
Copier après la connexion

(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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal