当前位置: 首页 > 知识库问答 >
问题:

从字符串计算Modbus RTU的CRC

云慈
2023-03-14

我有字符串:02 03 04 50 00 01。我需要计算这个字符串的CRC。

我有一个计算CRC的函数:

public static UInt16 ModRTU_CRC(ushort[] buf, int len)
        {
            UInt16 crc = 0xFFFF;

            for (int pos = 0; pos < len; pos++)
            {
                crc ^= (UInt16)buf[pos];

                for (int i = 8; i != 0; i--)
                {
                    if ((crc & 0x0001) != 0)
                    {
                        crc >>= 1;
                        crc ^= 0xA001;
                    }
                    else
                        crc >>= 1;
                }
            }
            return crc;
        }

我想将一个字符串强制转换为ushort数组:

ushort[] result = cmd.Split(' ').Select(item => Convert.ToUInt16(item, 16)).ToArray();

但是返回给我的是这样一个数组:2 3 4 80 01

请告诉我为了正确计算CRC我应该做些什么。

共有1个答案

鞠嘉誉
2023-03-14

看来,您希望将两个字节组合到ushort中,即对于给定的

  string cmd = "02 03 04 50 00 01";

你想要得到

  {0x0203, 0x0405, 0x0001}

如果是你的话,

  using System.Linq;

  ...

  string cmd = "02 03 04 50 00 01";

  ushort[] result = cmd
    .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
    .Select((value, index) => new { index, value = Convert.ToInt32(value, 16) })
    .GroupBy(item => item.index / 2, item => item.value)
    .Select(group => (UInt16)(group.Aggregate((s, a) => s * 256 + a)))
    .ToArray();
  Console.WriteLine(string.Join(" ", data.Select(item => item.ToString("x4"))));
  0203 0450 0001
  int skip = 2;

  ushort[] data = source
    .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
    .Select((value, index) => new { index, value = Convert.ToInt32(value, 16) })
    .GroupBy(item => item.index >= skip ? item.index / 2 : -item.index - 1, 
             item => item.value)
    .Select(group => (UInt16)(group.Aggregate((s, a) => s * 256 + a)))
    .ToArray();

  Console.WriteLine(string.Join(" ", data.Select(item => item.ToString("x4"))));
  0002 0003 0450 0001
 类似资料:
  • 主要内容:1. 如何创建计算字段,2. Tableau计算编辑器,3. 创建一个公式,4. 如何使用计算字段Tableau有许多用于字符串操作的内置字符串函数,例如:连接,比较和替换字符串中的部分字符等。 以下是创建计算字段并在其中使用字符串函数的一些步骤: 1. 如何创建计算字段 连接到Sample superstore等数据源后。 然后,转到“分析(Analysis)”菜单。 单击“创建计算字段(Create Calculated Field)”,如下图所示: 2. Tableau计算编辑器

  • 我对手动输入的字符串计数有点困惑。我基本上是在计算单词的数量和没有空格的字符的数量。如果可能的话,谁能帮助计算元音? 到目前为止,我只有这些:

  • 问题内容: 我正在做一个作业,在该作业中,我必须编写程序以读取用户的字符串,并打印出字符串中出现次数的字母。 例如,“ Hello world”应该打印出“ h = 1 e = 1 l = 3 o = 2 …等”,但是我只写“ hello world”和字母总数。 我不能使用hashmap函数,只能使用数组。有人可以给我一两个提示,提示如何从下面的书面代码继续进行操作以获得我的首选功能?我不完全了

  • 问题内容: 我认为我已经很好地理解了这一点,但我认为该陈述是错误的。怎么说包含空格,加1。 编辑: 我发现(感谢Blender)可以用更少的代码来做到这一点: 问题答案: 使用方括号,而不是括号: 或: 您也可以使用:

  • 问题内容: 如何计算特定字符串在另一个字符串中出现的次数。例如,这就是我要使用Javascript进行的操作: 问题答案: 在正则表达式(简称 全球 )说,搜索整个字符串,而不是只要找到第一次出现。这匹配两次: 并且,如果没有匹配项,则返回:

  • 本文向大家介绍python字符串,数值计算,包括了python字符串,数值计算的使用技巧和注意事项,需要的朋友参考一下 Python是一种面向对象的语言,但它不像C++一样把标准类都封装到库中,而是进行了进一步的封装,语言本身就集成一些类和函数,比如print,list,dict etc. 给编程带来很大的便捷 Python 使用#进行单行注释,使用 ''' 或 """ 进行多行注释 数值计算 字