如何从IP校验和字段计算Hexa值?

时间:2017-04-05 08:11:12

标签: c++ c checksum ipv4

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用位运算符

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

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

答案 1 :(得分:1)

您可以使用buffer[11] = (checkSum & 0xFF00) >> 8; buffer[12] = (checkSum & 0xFF)形式的表达式,但是您应该仔细检查您的处理器架构是否使用大端或小端形式来表示整数。因此,在某些系统上,您可能需要将表达式交换为buffer[12] = (checkSum & 0xFF00) >> 8; buffer[11] = (checkSum & 0xFF)

请参阅以下代码:

#include <stdio.h>

unsigned short getCheckSum(unsigned short buffer[]) {
    return 0xD780;
}

int main(int argc, const char *argv[])
{
    unsigned short buffer[20] = {0x45,0x00,0x00,0x4E,0x4E,0x05,0x00,0x10,0x80,0x11,0X00,0X00,0x0A,0x00,0x00,0x1C,0x1A,0x00,0x00,0x2F};

    unsigned short checkSum = getCheckSum(buffer);

    buffer[11] = (checkSum & 0xFF00) >> 8;
    buffer[12] = (checkSum & 0xFF);

    for (int i=0; i<20; i++) {
        printf("%02X ", buffer[i]);
    }

    return 0;
}