2015-02-15 1 views
0

Я пытаюсь написать функцию, которая вычисляет IP Header Checksum, используя this пример.Попробуйте рассчитать контрольную сумму IP-заголовка

Итак, сначала у меня есть мои байт IP заголовка:

byte[] arr = { 
       69, 0, 0, 60, 28, 70, 64, 0, 64, 6, 
       0, 0, 172, 16, 10, 99, 172, 16, 10, 12 
      }; 

Здесь я добавить все пары байтов:

public static ushort[] AddPairs(byte[] arr) 
{ 
    List<ushort> pairs = new List<ushort>(); 
    for (int i = 0; i < arr.Length; i += 2) 
    { 
     byte b1 = arr[i]; 
     byte b2 = arr[i + 1]; 
     ushort add = (ushort)((arr[i] << 8) + arr[i + 1]); 
     pairs.Add(add); 
    } 

    return pairs.ToArray(); 
} 

И здесь я должен вычислить Checksum:

public static void ComputeHeaderIpChecksum(byte[] arr) 
{ 
    ushort[] pairs = AddPairs(arr); 
    ushort result; 
    ushort tmp = 0; 


    for (int i = 0; i < pairs.Length; i++) 
    { 
     result = (ushort)(pairs[i] + pairs[i + 1]); 
     tmp = result; 
    } 
} 

Итак, сначала после добавления 2 значений, как я могу проверить, действительно ли это ushort без переноса? Я как бы застрял здесь и не знаю, что делать дальше и буду рад за помощь.

+0

этого алгоритму не очень быстро, что не является обязательным требованием? –

+0

Да, могу ли я помочь, как добиться быстрого алгоритма? –

+0

У меня есть один в C, вам нужно будет преобразовать его в C# –

ответ

0

C код контрольной суммы от микрочип

WORD CalcIPChecksum(BYTE *buffer, WORD count) 
{ 

    // wordval = CalcIPChecksum(&pEEPROMbuf[0x0800 + 6], 51); 
    WORD i; 
    WORD *val; 
    union 
    { 
     WORD w[2]; 
     DWORD dw; 
    } sum; 

    i = count >> 1; 
    val = (WORD *)buffer; 
    //unsigned char temp; 
    // Calculate the sum of all words 
    sum.dw = 0L; 
    while(i--) 
    { 
     //temp = *val; 
     sum.dw += (DWORD)*val++; 
    } 
    // Add in the sum of the remaining byte, if present 


    if (count & 0x1) 
    { 
     DWORD temp = (DWORD)*(BYTE *)val; 

     sum.dw += temp; 


    } 
    // Do an end-around carry (one's complement arrithmetic) 
    sum.dw = sum.w[0] + sum.w[1]; 

    // Do another end-around carry in case if the prior add 
    // caused a carry out 
    sum.w[0] += sum.w[1]; 
    WORD answer = ~sum.w[0]; 
    // Return the resulting checksum 
    return ; 
} 

Той же функции в C#

private UInt16 CalcIPChecksum(byte[] buffer, ushort count,int offset) 
{ 
    ushort i =0; 
    byte[] val = StatMethods.memcpy(ref buffer, offset, count);// get_byte_arr(buffer, count, offset); 
                   // public static byte[] memcpy(ref byte[] ar, int startposition, int offset) 

    UInt32 sum_dw = 0; 
    i = (ushort)(count >> 1); 
    sum_dw = 0; 
    int j = 0; 
    while (i > 0) 
    { 
     UInt16 restored = BitConverter.ToUInt16(val, j); 
     sum_dw += restored; 
     String s = sum_dw.ToString("X"); 
     System.Diagnostics.Debug.WriteLine("Number: "+i+" -- "+"value:" + s); 
     j += 2; 
     i--; 

    } 

    var aa = count & 0x1; 

    if (Convert.ToBoolean(aa)) 
    { 
     byte restored = val[j]; 

     sum_dw += (byte)restored; 


    } 
    byte[] sum_wb = BitConverter.GetBytes(sum_dw); 

    UInt16 sum_w0 = (UInt16)((UInt16)sum_wb[0] + (UInt32)(sum_wb[1]<<8)); 
    UInt16 sum_w1 = (UInt16)((UInt16)sum_wb[2] + (UInt32)(sum_wb[3] << 8)); 

    sum_dw = (UInt32)sum_w0 + (UInt32)sum_w1; 

    sum_wb = BitConverter.GetBytes(sum_dw); 

    sum_w0 = (UInt16)((UInt16)sum_wb[0] + (UInt32)(sum_wb[1] << 8)); 
    sum_w1 = (UInt16)((UInt16)sum_wb[2] + (UInt32)(sum_wb[3] << 8)); 

    sum_w0 += sum_w1; 



    var reverse = ~(sum_w0); 
    UInt16 ans = (UInt16)(~(sum_w0)); 
    System.Diagnostics.Debug.WriteLine("Asnwer: "+reverse); 

    return (UInt16)reverse; 

} 

Надеется, что это помогает

 Смежные вопросы

  • Нет связанных вопросов^_^