我们正致力于向PSI SI发送UDP数据包。我们正在开发PSI SI发生器。 但我们坚持使用CheckSum CRC32 - 我们无法找到校验和。我尝试了几个来自互联网的代码。它提供了一些校验和,但校验和与wireshark校验和不匹配。
我们有使用正确校验和的PSISI数据包的wireshark转储。
任何人都可以帮我计算PSI SI的校验和吗?
此致 VIPUL
答案 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;
}