2017-02-21 3 views
-4

Ich habe einige C++ - Code, den ich in C# konvertieren möchte, aber ich verstehe nicht vollständig, was passiert.Konvertieren von C++ in C#: Übergeben Zeiger auf Funktionen

Hier ist der C++ Code:

BYTE buffer[150]; // byte is of type ‘unsigned char’ 
int i; 
checksum = 0; 


for (i = 0; i < count; i++) 
    checksum += HexToByte(&buffer[2 + i * 2]);//HOW DO I PASS THIS ARGUMENT 
checksum = ~checksum; 

BYTE HexToNibble(BYTE HexChar){ 
    if ((HexChar >= 48) && (HexChar <= 57)) return HexChar - 48; 
    if ((HexChar >= 65) && (HexChar <= 70)) return HexChar - 55; 
    if ((HexChar >= 97) && (HexChar <= 102)) return HexChar - 87; 
    return 0; 
} 

BYTE HexToByte(BYTE* HexPtr){ 
    return HexToNibble(HexPtr[0]) * 0x10 + HexToNibble(HexPtr[1]); //AND USE THE ARGUMENT LIKE THIS 
} 

Meine Verwirrung in Bezug auf ist, wie die 'HexToByte' Funktion den Zeiger verwendet. Es sieht so aus, als würden wir einen Zeiger auf einen bestimmten Index des Pufferarrays übergeben, aber dann fortfahren, es so zu verwenden, als wäre es immer noch ein Array?

Bei der Konvertierung in C# -Code bin ich nicht sicher, was der Parameter für die HexToByte-Funktion sein sollte?

Jede Hilfe/Klarheit über die Situation wäre willkommen.

Hier ist mein Code Implementierung

für den Vorschlag

In der C++ Code

// Modified C++ code 
     // Arrays are reference types in .NET framework so I don't need to pass a pointer. 
    public static byte HexToByte(byte[] buffer) 
    { 
     return HexToNibble((byte)((buffer[0] * 0x10) + HexToNibble(buffer[1]))); 
    } 

private static byte HexToNibble(byte HexChar) 
{ 
    if ((HexChar >= 48) && (HexChar <= 57)) 
     return (byte)(HexChar - 48); 
    if ((HexChar >= 65) && (HexChar <= 70)) 
     return (byte)(HexChar - 55); 
    if ((HexChar >= 97) && (HexChar <= 102)) 
     return (byte)(HexChar - 87); 
    return 0; 
} 


checksum = 0; 
for (int j = 0; j < count; j++) 
    checksum += utils.HexToByte(buffer[2 + i * 2]); // can't pass this argument ??? WHY CAN I DO THIS IN C++?? 
+0

Der HexToByte Parameter nur ein Byte-Array in C# sein sollte. –

+0

Ja, aber wie übermittele ich dann einen bestimmten Index innerhalb dieses Bytearrays, wie es im obigen C++ - Code geschieht? Außerdem ist die HexToByte eine generische Funktion, die an vielen Stellen verwendet wird. –

+1

Sie sollten die dezimalen ASCII-Nummern durch ihre wörtlichen Zeichen ersetzen, z. B. "A" anstelle von 65. –

Antwort

0

@tinstaafl Dank (die nicht funktioniert) das Argument ist ein Zeiger, der in der zu einem spefic Element verweist Byte-Array (dh einige Startadresse). In der Funktion 'HexToByte' verwendet es denselben Zeiger, um das Element, auf das es zeigt, plus das nächste Element zu erhalten. Hier

ist die C# -Implementierung

 public static byte HexToByte(byte[] buffer, int index) 
     { 
      return HexToNibble((byte)((buffer[index] * 0x10) + HexToNibble(buffer[index + 1]))); 
     } 
     private static byte HexToNibble(byte HexChar) 
     { 
      if ((HexChar >= 48) && (HexChar <= 57)) 
       return (byte)(HexChar - 48); 
      if ((HexChar >= 65) && (HexChar <= 70)) 
       return (byte)(HexChar - 55); 
      if ((HexChar >= 97) && (HexChar <= 102)) 
       return (byte)(HexChar - 87); 
      return 0; 
     } 

// calculate the checksum 
checksum = 0; 
for (int j = 0; j < count; j++) 
    checksum += utils.HexToByte(buffer, buffer[2 + i * 2]);