C# 无法重新创建客户端提供的校验和结果

C# 无法重新创建客户端提供的校验和结果,c#,checksum,C#,Checksum,我有一个客户给了我以下测试数据字符串: AAA | E0071001 | D | 200904010101 | EC | UKDC | BP |********1 | TR01 | CPD | AAA123 |测试参与者A123 | P | BBB456 |新参与者B456 | P | ER2 | NAH1 |测试参与者| 20090401 | | | EAD | 7 | | | ZZZ | 5 | 474617386 | 第一行被视为页眉数据(以AAA开头),最后一行被视为页脚(ZZZ)。其余

我有一个客户给了我以下测试数据字符串:

AAA | E0071001 | D | 200904010101 | EC | UKDC | BP |********1 | TR01 |
CPD | AAA123 |测试参与者A123 | P | BBB456 |新参与者B456 | P |
ER2 | NAH1 |测试参与者| 20090401 | | |
EAD | 7 | | |
ZZZ | 5 | 474617386 |

第一行被视为页眉数据(以AAA开头),最后一行被视为页脚(ZZZ)。其余部分是主体(以CPD、ER2、EAD开头的行)

页脚包含一个校验和值(此处:474617386)。我自己需要能够按照以下规则获得此值:

  • 将结果变量初始化为0
  • 依次考虑每条记录(包括页眉,但不包括页脚)
  • 将每条记录分成四个字节(字符)部分(不包括行尾字符),如果需要,用空值填充,并将它们放入结果变量中的异或(XOR)
  • 客户端提供了一个类似c的伪代码:

    num_chars = strlen (record_buffer)
    FOR (i = 0;i < num_chars;)
      value = 0
      FOR (j = 0; j < 4; i++, j++)
        IF i < num_chars
          value = ((value << 8 ) + record_buffer[i])
        ELSE
          value = value << 8
        END IF
      ENDFOR
    
    result = result XOR value
    ENDFOR
    
    num\u chars=strlen(记录缓冲区)
    对于(i=0;ivalue=((value问题在于客户端提供了过时的文件。
    
    代码运行得很好。

    您是否尝试过用计算器手工操作并验证结果?您使用的记录缓冲区是什么?@DesertFox-我尝试过以下方法:1.由上面的前4行组成的单个字符串(不包括行尾)2.每一行都被视为记录缓冲区。在前4行重复此操作。n将4个结果值相加。这两个操作都不起作用。
    var result = 0;
    var num_chars = record_buffer.Length;
    
    for (int i = 0; i < num_chars;)
    {
      var value = 0;
        for (int j = 0; j < 4;i++, j++)
        {
          if (i < num_chars)
            value = ((value << 8) + record_buffer[i]);
          else
            value = value << 8;
        }
    
        result = result ^ value;
    }