有人能为这个提供伪代码吗? 我不是C++程序员,但是这个算法出现在我正在使用的机器的操作手册中,我正在努力理解它。我希望有人解释其中的一些术语,或者可能是整个代码的流程,因为我没有时间在项目过程中学习C

有人能为这个提供伪代码吗? 我不是C++程序员,但是这个算法出现在我正在使用的机器的操作手册中,我正在努力理解它。我希望有人解释其中的一些术语,或者可能是整个代码的流程,因为我没有时间在项目过程中学习C,c++,C++,有关机器的波形文件由多个标签组成,这些标签放在花括号内。校验和使用波形标记{波形长度:#数据}计算 “数据”由以十六进制数表示的字节数组成。“length”是“data”中的字节数,“start”显然是指“data”中的第一个字节 我已经设法解决了一些术语,但我特别不确定我对((UINT32*)start)[I] UINT32 checksum(void *start, UINT32 length) { UINT32 i, result = 0xA50F74FF; for(i=0

有关机器的波形文件由多个标签组成,这些标签放在花括号内。校验和使用波形标记{波形长度:#数据}计算

“数据”由以十六进制数表示的字节数组成。“length”是“data”中的字节数,“start”显然是指“data”中的第一个字节

我已经设法解决了一些术语,但我特别不确定我对
((UINT32*)start)[I]

UINT32 checksum(void *start, UINT32 length)
{
    UINT32 i, result = 0xA50F74FF;
    for(i=0; i < length/4; i++)
        result = result ^ ((UINT32 *)start)[i];
    return(result);
}
UINT32校验和(无效*开始,UINT32长度)
{
UINT32 i,结果=0xA50F74FF;
对于(i=0;i
因此,据我所知,代码执行以下操作:

  • 取“数据”中第一个字节的地址和“数据”的长度
  • 创建一个名为result的变量,它是一个无符号整数
    A50F74FF
  • 对于数据字符串前25%中的每个字节,将“result”提高到该幂(可能是模2^32)
  • 将结果作为值
    校验和返回
  • 我在这里是正确的还是在其中一个步骤上误读了算法?我觉得我不可能是正确的,因为仅基于部分数据的校验和不会发现数据后面部分的错误

  • 对于数据字符串前25%中的每个字节,将“result”提高到该幂(可能是模2^32)
  • 这是错误的
    ^
    是按位异或操作。它没有上升到一个权力

    另外,关于“数据字符串的”。该算法迭代指向的数据,就像它是
    UINT32
    的数组一样。事实上,如果
    start
    没有指向
    UINT32
    数组的(元素),则程序的行为是未定义的1。最好首先将参数声明为
    UINT32*
    ,而不使用显式强制转换

    此外,关于“数据字符串前25%中的每个字节”,该算法似乎会遍历(几乎2)从
    start
    start+length
    的所有字节<代码>长度
    可能以字节为单位,而
    UINT32
    可能是由4个字节组成的类型。因此,
    N
    字节的
    UINT32
    对象数组包含
    N/4
    元素
    UINT32
    。请注意,这假设字节为8位宽,这可能是本手册可以做出的假设,但请记住,这不是一个适用于所有系统的假设

    对于C++语言而言,P>1 UB。但是,如果它显示在机器的操作手册中,那么特定硬件的特殊编译器可能会为此指定已定义的行为。也就是说,手册的作者很可能犯了错误


    2如果长度不能被4整除,则不使用剩余的1-3字节。

    因此此函数的伪代码大致如下:

    function checksum(DATA)
        RESULT = 0xA50F74FF;
        for each DWORD in DATA do
            RESULT = RESULT xor DWORD
        return RESULT
    
    其中,
    DWORD
    是一个四字节整数值


    该函数实际上(几乎)遍历了所有数据(不是25%),但它是以4字节的增量执行的,这就是为什么以字节为单位的
    长度被4除的原因。

    您可能应该这样做。运算符
    ^
    不是幂运算符或“提升”运算符,它是按位操作。
    ^
    不是按幂提升,而是按位异或。否则您或多或少是正确的。您只需对
    start
    中的每个双字(32位)进行异或运算
    result
    ,然后返回
    result
    。另外请注意,函数容易出现未定义的行为,因为它可能会中断。它要求长度是4的倍数,否则它不会使用所有字节进行校验和。谢谢。我不太清楚,从原始代码来看,为什么start[0]是开头,而start[1]是第五个字节。是UINT32告诉它每个地址必须是32位长,还是有其他原因?@Patrick,
    (UINT32*)
    告诉编译器将
    start
    解释为指向4字节整数的指针,因为C中的指针可以用作数组,所以每个
    ((UINT32*)start)[i]
    是数组中从
    开始的第i个4字节元素。