C 在结构中添加所有字节
C++ add up all bytes in a structure
给定这样的包装结构:
struct RSDPDescriptor {
char Signature[8];
uint8_t Checksum;
char OEMID[6];
uint8_t Revision;
uint32_t RsdtAddress;
} __attribute__ ((packed));
我如何总结其中的所有字节?
我只是向前转到 std::accumulate
:
template <typename T>
size_t sum_bytes(const T& obj) {
const unsigned char* p = reinterpret_cast<const unsigned char*>(&obj);
return std::accumulate(p, p + sizeof(T), 0u);
}
这是一些代码,显示了两种方法。
第一种方法更容易,更有效,但会给没有包装属性的结构给出错误的结果(因为它会错误地包含填充字节,以便在其计数中)。
第二种方法将在任何结构(填充或包装)上使用。
#include <stdio.h>
#include <stdlib.h>
template<typename T> int CountBytes(const T & t)
{
int count = 0;
const unsigned char * p = reinterpret_cast<const unsigned char *>(&t);
for (int i=0; i<sizeof(t); i++) count += p[i];
return count;
}
struct RSDPDescriptor {
char Signature[8];
unsigned char Checksum;
char OEMID[6];
unsigned char Revision;
unsigned int RsdtAddress;
} __attribute__ ((packed));
int main(int, char **)
{
struct RSDPDescriptor x;
int byteCountFast = CountBytes(x);
printf("Fast result (only works correctly if the struct is packed) is: %in", byteCountFast);
int byteCountSafe = CountBytes(x.Signature) + CountBytes(x.Checksum) + CountBytes(x.OEMID) + CountBytes(x.Revision) + CountBytes(x.RsdtAddress);
printf("Safe result (will work even if there is padding) is: %in", byteCountSafe);
return 0;
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 从不同线程使用int64的不同字节安全吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- C++向指针地址添加 4 个字节
- 为什么非犯罪序列化添加了5个字节零前缀
- 为什么 ofstream::write 在文件末尾添加额外的字节
- 将结构添加到字节向量,然后添加另一个
- C 在结构中添加所有字节
- 在Windows上添加/删除文件末尾的字节
- 如何添加2个四位Hexa以生成ASCII字符字节
- C++添加额外字节的字符串流
- addByteLength() 不添加字节以在 omnet++ 中发送消息
- 一个非内联非虚拟方法向类的实例添加了多少字节?C++
- 添加字节*数据到双精度向量
- c++中每个X字节添加空字节
- C++ 将字节值作为 int 添加到 CString