将CRC计算从C#转换为C

将CRC计算从C#转换为C,c#,c,pic,crc,C#,C,Pic,Crc,我目前正在使用串行监视器,为了确保数据的完整性,我正在尝试实现CRC8校验和,下面是我在发送消息之前对任何消息所做的计算 public byte Checksum(params byte[] val) { if (val == null) throw new ArgumentNullException("val"); byte c = 0; foreach (byte b in val) { c = table[c ^ b];

我目前正在使用串行监视器,为了确保数据的完整性,我正在尝试实现CRC8校验和,下面是我在发送消息之前对任何消息所做的计算

public byte Checksum(params byte[] val)
{
    if (val == null)
        throw new ArgumentNullException("val");
    byte c = 0;
    foreach (byte b in val)
    {
        c = table[c ^ b];
    }
    return c;
}
我使用0xD8生成一个表:

public byte[] GenerateTable(CRC8_POLY polynomial)
{
    byte[] csTable = new byte[256];
    for (int i = 0; i < 256; ++i)
    {
        int curr = i;
        for (int j = 0; j < 8; ++j)
        {
            if ((curr & 0x80) != 0)
            {
            curr = (curr << 1) ^ (int)polynomial;
            }
            else
            {
                curr <<= 1;
            }
        }
        csTable[i] = (byte)curr;
    }
    return csTable;
}
据我所知,这段代码按预期工作,我使用表格生成器在微控制器中实现硬编码表格,以加快进程。
我不太明白的是我是如何实现一个函数来计算CRC的,就像我在这里做的一样。 欢迎向正确方向提供帮助或指导。 到目前为止,我已经提出了这个函数:

uint8_t crc8(uint8_t *crc)
{
    uint8_t crcVal;
    int m;
    for (m = 0; m < PacketSize ;m++ )startbyte
    {
        *crc = crc8_table[(*crc) ^ m];
        *crc &= 0xFF;        
    }
}
从rxFrame中可以找到PacketSize。查看C代码的大小应为:

uint8_t crc8(uint8_t const *crc, size_t size)
{
    unit8_t c = 0;
    size_t  m;
    for (m = 0; m < size; m++ )
    {
        c = crc8_table[c ^ *crc];
        crc++;
    }

    return c;
}
uint8\u t crc8(uint8\u t const*crc,size\u t size)
{
单元8_t c=0;
尺寸(m);;
对于(m=0;m
查看C代码应该是:

uint8_t crc8(uint8_t const *crc, size_t size)
{
    unit8_t c = 0;
    size_t  m;
    for (m = 0; m < size; m++ )
    {
        c = crc8_table[c ^ *crc];
        crc++;
    }

    return c;
}
uint8\u t crc8(uint8\u t const*crc,size\u t size)
{
单元8_t c=0;
尺寸(m);;
对于(m=0;m
因此您只需将C#函数移植到C

public byte Checksum(params byte[] val)
{
    if (val == null)
        throw new ArgumentNullException("val");
    byte c = 0;
    foreach (byte b in val)
    {
        c = table[c ^ b];
    }
    return c;
}
I。C中没有异常。使用返回值指示错误,并添加一个参数作为返回值。由您决定是将消息长度作为参数传递,还是将其保留在全局范围内:

int checksum(uint8_t const *msg, size_t msglen, uint8_t *result)
II
foreach
循环被转换为
for
循环,其中
i
是索引,
msg[i]
是来自
foreach
b

int checksum(uint8_t const *msg, size_t msglen, uint8_t *result)
{
    if (msg == NULL || msglen == 0)
        return 0;

    uint8_t crc = 0;
    for (int i = 0; i < msglen; i++)
    {
        crc = table[crc ^ msg[i]];
    }

因此,您只需将C#函数移植到C

public byte Checksum(params byte[] val)
{
    if (val == null)
        throw new ArgumentNullException("val");
    byte c = 0;
    foreach (byte b in val)
    {
        c = table[c ^ b];
    }
    return c;
}
I。C中没有异常。使用返回值指示错误,并添加一个参数作为返回值。由您决定是将消息长度作为参数传递,还是将其保留在全局范围内:

int checksum(uint8_t const *msg, size_t msglen, uint8_t *result)
II
foreach
循环被转换为
for
循环,其中
i
是索引,
msg[i]
是来自
foreach
b

int checksum(uint8_t const *msg, size_t msglen, uint8_t *result)
{
    if (msg == NULL || msglen == 0)
        return 0;

    uint8_t crc = 0;
    for (int i = 0; i < msglen; i++)
    {
        crc = table[crc ^ msg[i]];
    }

不要使用指针,转换为数组

        public static byte crc8(byte[] crc)
         {
             byte crcVal;
             int m;
             for (m = 0; m < PacketSize; m++)
             {
                 crc[m] = crc8_table[crc[m] ^ m];
                 crc[m] &= 0xFF;
             }
             return crcVal;
         }
公共静态字节crc8(字节[]crc)
{
字节crcVal;
int m;
对于(m=0;m
不要使用指针,转换为数组

        public static byte crc8(byte[] crc)
         {
             byte crcVal;
             int m;
             for (m = 0; m < PacketSize; m++)
             {
                 crc[m] = crc8_table[crc[m] ^ m];
                 crc[m] &= 0xFF;
             }
             return crcVal;
         }
公共静态字节crc8(字节[]crc)
{
字节crcVal;
int m;
对于(m=0;m
在这里提问之前,你应该在翻译方面做一些努力。这不是一个针对我的代码服务。我同意,我只是觉得把所有这些都混在一起会让人困惑。编辑以包含我关于计算CRCY的内容。在这里提问之前,你应该在翻译上发表一些文章。这不是一个针对我的代码服务。我同意,我只是觉得把所有这些都混在一起会让人困惑。编辑以包括我关于计算crcNice的内容。但是一些小的挑剔:1
msg
应该是
uint8\u t const*
,因为它没有被修改。2.当不处理数组
result[0]=crc;->*结果=crc。可选挑剔:
result
严格来说不是必需的,您也可以对错误代码使用负返回值,并对结果返回
0-255
。@user694733
const
和数组表示法:同意。错误代码:实际上这是一个很好的把戏!我传递什么作为结果参数?因为crc值被追加到msg数组。thx澄清了一切,它帮助我理解额外的原因code@Claudi正如您在第四部分中看到的,我创建了一个变量
crc
,并将
&crc
传递给函数,以便将结果写入
crc
变量
&crc
表示存储器中crc的
地址
。这大致相当于说“我有一个
crc
变量在0x0ea134c,请把结果放在那里”。指针和内存地址在C语言中是很重要的概念,所以我建议你阅读一下。我希望每次我有问题的时候都能有你在我身边,因为你能准确地向我解释它。我现在已经实现了一个粗略的等价物,它很有效。很好。但是一些小的挑剔:1
msg
应该是
uint8\u t const*
,因为它没有被修改。2.当不处理数组
result[0]=crc;->*结果=crc。可选挑剔:
result
严格来说不是必需的,您也可以对错误代码使用负返回值,并对结果返回
0-255
。@user694733
const
和数组表示法:同意。错误代码:实际上这是一个很好的把戏!我传递什么作为结果参数?因为crc值被追加到msg数组。thx澄清了一切,它帮助我理解额外的原因code@Claudi正如您在第四部分中看到的,我创建了一个变量
crc
,并将
&crc
传递给函数,以便将结果写入
crc
变量
&crc
表示存储器中crc的
地址
。这大致相当于说“我有一个
crc
变量在0x0ea134c,请把结果放在那里”。指针和内存地址在C语言中是很重要的概念,所以我建议你阅读一下。我希望每次我有问题的时候都能有你在我身边,因为你能准确地向我解释它。我现在已经实现了一个粗略的等价物,它可以工作了<代码>crc
的名称不正确。2.它应该具有类型
uint8\u t const*