计算 GFP 载荷 FCS

标签 c crc32

我正在尝试计算 GFP(通用成帧过程)帧的有效负载 FCS (pFCS),但无法获得正确的值。

我所做的是对有效载荷进行解扰,并对从有效载荷报头(4 字节 PTI、PFI、EXI、UPI、eHEC)开始到 GFP PDU 结尾的字节使用 CRC32,不包括 4 字节 pFCS。我使用的 CRC32 代码取自 echo47's post .

#include <stdio.h>

int main(void)
{
  unsigned char data[] =
  {
    0x00, 0x0A, 0xE6, 0xF0, 0x05, 0xA3, 0x00, 0x12,
    0x34, 0x56, 0x78, 0x90, 0x08, 0x00, 0x45, 0x00,
    0x00, 0x30, 0xB3, 0xFE, 0x00, 0x00, 0x80, 0x11,
    0x72, 0xBA, 0x0A, 0x00, 0x00, 0x03, 0x0A, 0x00,
    0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x1C,
    0x89, 0x4D, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
    0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
    0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13
  };
  unsigned int crc_table[] =
  {
    0x4DBDF21C, 0x500AE278, 0x76D3D2D4, 0x6B64C2B0,
    0x3B61B38C, 0x26D6A3E8, 0x000F9344, 0x1DB88320,
    0xA005713C, 0xBDB26158, 0x9B6B51F4, 0x86DC4190,
    0xD6D930AC, 0xCB6E20C8, 0xEDB71064, 0xF0000000
  };
  unsigned int n, crc=0;

  for (n=0; n<sizeof(data); n++)
  {
    crc = (crc >> 4) ^ crc_table[(crc ^ (data[n] >> 0)) & 0x0F];  /* lower nibble */
    crc = (crc >> 4) ^ crc_table[(crc ^ (data[n] >> 4)) & 0x0F];  /* upper nibble */
  }
  for (n=0; n<4; n++)  /* display the CRC, lower byte first */
  {
    printf("%02X ", crc & 0xFF);
    crc >>= 8;
  }
  printf("\n");
  return 0;
}

我能够使用此 CRC32 代码获得正确的以太网 FCS,但无法获得 GFP pFCS。 eHEC 也是正确的值。我是不是计算错了 pFCS,还是需要使用不同的 CRC32 计算方法?

最佳答案

在使用 CRC calculator code 之后,我终于能够为 GFP 帧获得正确的 CRC32 值。并将 #define REVERSED_DATATRUE 更改为 FALSE

我想我以前无法获得正确的值,因为发送位的顺序。 GFP 以与以太网相反的方向发送比特,如本 post 中所述.

关于计算 GFP 载荷 FCS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24582254/

相关文章:

c - X11 - XCreateImage、Visual * vis 参数

c - 运算符有什么用!!在C?

algorithm - 如何在保持 CRC-32 校验和的同时修改文件?

python - 在 Python 中使用 zlib crc32_combine

c - 32 位 CRC 计算与在线生成器不匹配

c - 我如何使用 mblen()?

c - 在此 C 程序中,静态变量在内存中的位置如何变化?

c - 如何修改 ListView 子项中单个字符的字体颜色?

c - 我怎样才能加快crc32计算?

php - Pycrc 和 PHP 代码的 CRC32 计算与预期结果不匹配