c++ - 如何从 IP 校验和字段计算十六进制值?

标签 c++ c checksum ipv4

我有一个无符号短缓冲区,它包含 IP header 的六进制值。

unsigned short buffer = {45,00,00,4E,4E,05,00,10,80,11,0X00,0X00,0A,00,00,1C,1A,00,00,2F};

我在校验和的位置添加了 0X00 , 0X00 并使用 RFC 1071 - 计算 IP header 校验和 计算校验和。所以它返回一个 unsigned short checksum 值。现在我需要插入到 Ip 缓冲区。

例如:如果我的unsigned short checksum value = 55168 并且它的十六进制值= D780。现在我需要将 D780 添加到 buffer[11]buffer[12] 。我如何转换无符号短校验和值并拆分十六进制值以插入缓冲区?如果它 Hex = D78 ,那么我还需要将 0D78 添加到缓冲区字段。

最佳答案

您可以使用位运算符分隔值

buffer[11] = (checksum >> 8) & 0xff;
buffer[12] = checksum & 0xff;

第一行将校验和向右移动 8 位,相当于除以 256,然后确保您仅通过使用 and(&) 运算符获取剩余 8 位 (0xD7) 的信息0xff 在二进制表示中等于 1111 1111。 第二行还使用 and 运算符仅保存校验和的最后 8 位,即 0x80。

关于c++ - 如何从 IP 校验和字段计算十六进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225466/

相关文章:

c - STM32 HAL SPI 16 位发送

c - 队列类型数据结构使用数组实现

char *str[ ] 通过引用传递不起作用

c++ - 指针不可从列表中取消引用

c++ - PluginController 的概念和设计

checksum - 如何计算 REBOL 3 模块校验和?

复制后sqlite Db的Android MD5校验和发生变化

java - 检查两个图像文件是否相同..校验和或哈希?

c++ - 在 boost 中序列化二进制数据失败,出现 `invalid signature' 错误

c++ - QwtPlot 在 AutoScale 期间自动调整大小