我有一个无符号短缓冲区,它包含 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
。现在我需要将 D7
、 80
添加到 buffer[11]
和 buffer[12]
。我如何转换无符号短校验和值并拆分十六进制值以插入缓冲区?如果它 Hex = D78
,那么我还需要将 0D
和 78
添加到缓冲区字段。
最佳答案
您可以使用位运算符分隔值
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/