结构体的校验和

标签 c

UInt16 CheckSumUpdate (LOG_ENTRY_TYPE* pointer, UInt16 size)            
{
    UChar* data;    
    data = pointer;

    UInt16 chk = 0;
    while (size--)
    {
        chk += *data++;
    }
    return chk;
}

//message data structure typedef

typedef struct 
{
     TIMESTAMP_TYPE oTimeStamp;
     ASSERT_ID_TYPE ucAssertID;
     Int16 iData1;
     Int16 iData2;
     UInt16 uiChecksum;
}
LOG_ENTRY_TYPE;

TIMESTAMP_TYPE 是一个具有 16 位毫秒计数器和 32 位秒计数器的结构体,而 ASSERT_ID_TYPE 只是一个枚举列表,其中包含我在操作时要检查的一堆内容。

所以这种方法可行,但一旦值高于 255,就会发生一些不好的事情。我知道无符号字符 (UChar) 可以表示最多 255 的数字,但如果我将 UChar 更改为 UInt16,我也不会得到正确的答案。有人可以在这里指出我的问题吗?

最佳答案

UInt32 chk = 0;
chk += data->iData1;
chk += data->iData2;

https://en.wikipedia.org/wiki/Struct_(C_programming_language)

关于结构体的校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25067696/

相关文章:

c - 段错误 - C 错误中的字符串连接

c - 将 typedef 引用为其对应的结构

c++ - 在 C 中允许重复的 const 限定符但在 C++ 中不允许?

通过源代码编译c文件

c - 在C中动态声明各种二维数组

android - 尝试在 Android 上使用 JNI,但在我的 c 程序中获取 undefined reference

c - OSX/iOS 上的虚拟内存与 Windows 提交/保留行为

c - Getopt 转移 optarg

c - 在 C 中使用宏的 vsprintf 段错误

c - c中其他宏串联内的宏串联