簡體   English   中英

將C ++指針數學轉換為C#

[英]Converting C++ Pointer Math to C#

我目前正在從事一個需要將一些C ++代碼轉換為C#環境的項目。 在大多數情況下,它實際上非常簡單,但是我目前正在轉換一些較低級別的內存操作函數,並且在如何進行方面遇到了一些不確定性。

在C ++代碼中,我有很多類似這樣的實例(很簡單):

void SomeFunc(unsigned char* myMemoryBlock)
{
    AnotherFunc(myMemoryBlock);

    AnotherFunc(myMemoryBlock + memoryOffset);
}

void AnotherFunc(unsigned char* data)
{
    // Also simplified - basically, modifying the
    // byte pointed to by data and then increasing to the next item.
    *data = 2;
    data++;

    *data = 5;
    data++;

    // And so on...
} 

我在想,在C#中,我基本上必須將“ unsigned char *”視為字節數組(byte [])。 但是要執行與指針算法類似的操作,是實質上只是增加用於訪問字節數組的“ currentIndex”值嗎? 對於AnotherFunc之類的東西,我想這意味着如果起始索引不為0,我還需要傳遞起始索引?

只是想確認這是在C#中應該如何完成,或者是否有更好的方法來進行這種轉換。 另外,我不能在當前環境中使用“不安全”關鍵字,因此實際上無法使用指針!

這兩個函數將myMemoryBlock視為代表數組。 您可以用一對myArraymyOffset替換單個myMemoryBlock參數,如下所示:

void SomeFunc(char[] myArray)
{
    AnotherFunc(myArray, 0);

    AnotherFunc(myArray, memoryOffset);
}

void AnotherFunc(char[] data, int offset)
{
    // Also simplified - basically, modifying the
    // byte pointed to by data and then increasing to the next item.
    data[offset++] = 2;
    data[offset++] = 5;
    // And so on...
}

注意: C ++類型的unsigned char通常用作“無類型的內存塊”(而不是“代表字符數據的內存塊”)的替代。 如果您的情況如此,即指針指向的內存不一定是字符,那么byte數組將是更合適的選擇。

就像@dasblinkenlight所說的那樣,處理內存數據塊(通常是字節或char數組)的任意指針的C#(和Java)方法是在訪問數據塊的方法中添加一個額外的offset參數。

添加第三length參數也是很常見的。 因此,傳遞給內存塊的方法Foo()的一般形式為:

// Operate on 'block', starting at index 'offset',
// for 'length' elements
//
int Foo(byte[] block, int offset, int length)
{ ... }

您可以在C#庫中的各處看到它。 對於在兩個內存塊上進行操作的方法(例如,將一個塊復制到另一個或將一個塊與另一個進行比較,等等)的另一種常見形式是:

// Operate on blocks 'src' starting at index 'srcOff',
// and on block 'dst' starting at 'dstOff',
// for a total of 'length' elements
//
int Bar(byte[] src, int srcOff, byte[] dst, int dstOff, int length)
{ ... }

對於希望在整個內存塊(數組)上運行的方法,通常如下所示:

// Overloaded version of Foo() that
// operates on the entire array 'block'
//
int Foo(byte[] block)
{
    return Foo(block, 0, block.Length);
}

C#完全出於防止指針算術(而是指針算術易受攻擊的錯誤)的原因而放棄了指針。

通常,任何由指針和內存偏移量引用的C ++內存塊的確可以最好地轉換為C#中的數組(因此,即使C#數組也以[0]開頭)。但是,您應保持數組與基礎數據的類型相同- char[]代替byte[] 由於這也是char[] ,因此您應該查看該函數的整體用途,並考慮切換到string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM