如何用psi / si数据包计算crc32

时间:2016-01-27 09:57:49

标签: vb.net udp

我们正致力于向PSI SI发送UDP数据包。我们正在开发PSI SI发生器。 但我们坚持使用CheckSum CRC32 - 我们无法找到校验和。我尝试了几个来自互联网的代码。它提供了一些校验和,但校验和与wireshark校验和不匹配。

我们有使用正确校验和的PSISI数据包的wireshark转储。

任何人都可以帮我计算PSI SI的校验和吗?

此致 VIPUL

1 个答案:

答案 0 :(得分:1)

我正在开发一个DVB-S主站并操纵SI数据我遇到了同样的问题。解决方案是准确读取ISO / IEC 13818-1并使用正确的算法。

ISO / IEC 13818-1描述了PSI表的一部分的开始由相同传输流包有效载荷中的指针字段指示。这意味着,在节数据前面总是有一个指针字段,并且该指针字段不能放在校验和计算中。指针字段的第一个字节是字段数据的长度。在大多数情况下,没有字段数据,您会在截面数据前面找到一个简单的零,以该节的表ID开头。不要将这个零用于校验和计算。

MPEG的CRC 32是一种循环未反射的冗余校验,以0xffffffff开头,首先取最高位。神奇值为0x04C11DB7,可以通过ISO / IEC 13818-1附录B中指定的多项式轻松导出,并将每个位分配给多项式指数。

总而言之,你有这个简单的代码来计算校验和:

uint calcCrc32(byte[] sectionData, int sectionDataLength)
{

    uint crc32 = 0xffffffff;
    for (int i = 1 + sectionData[0]; i < sectionDataLength; i++)
    {
        byte b = sectionData[i];
        for (int bit = 0; bit < 8; bit++)
        {
            if ((crc32 >= 0x80000000) != (b >= 0x80))
                crc32 = (crc32 << 1) ^ 0x04C11DB7;
            else
                crc32 = (crc32 << 1);
            b <<= 1;
        }
    }
    return crc32;
}