将C ++函数重写为C#(将指针传递给数组中的下一个元素)

时间:2015-11-18 08:03:20

标签: c# c++

我需要将此C ++函数重写为C#

bool DesDecrypt(const BYTE *InBuff, DWORD dwInBuffSize, BYTE *OutBuff, DWORD dwOutBuffSize, const char *TerminalID)
{

...

for(DWORD i = 0 ; i < dwInBuffSize/8 ; i++)
        DES.des_ecb_encrypt((des_cblock *)InBuff+i, (des_cblock *)OutBuff+i, sched, DES_DECRYPT) ;


}

我被困的地方是指针算术。在C ++方面,您可以看到作者使用

InBuff+i

所以它正在推进指针并将其传递给函数。

在C#上我的功能如下:

public static bool DesDecrypt(byte[] inBuff, uint inBuffSize, byte[] outBuff, uint outBufSize, string terminalID)
{
.....
}

我遇到了如何重写上面的循环(特别是如何将指针传递给字节数组中的下一个元素)到C#。在C#中没有指针算术,所以如果我做类似的话,它只会传递第i个字节数组的值。

那么我如何模拟C#传递指向数组中下一个元素的指针?

这是我在C#中的解密功能

public static byte[] DecryptDES_ECB(byte [] ciphertext, byte [] key)

我应该使用而不是C ++版本:DES.des_ecb_encrypt

我正在寻找这样的包装器作为C#侧的解决方案

 public static byte[] DecryptDES_ECB(byte[] ciphertext, int cipherOffset, byte[] key)
    {
        byte [] tmp = new byte [ciphertext.Length - cipherOffset];
        for(int i = 0; i<ciphertext.Length - cipherOffset; i++)
        {
            tmp[i] = ciphertext[cipherOffset + i];


        }
        return DecryptDES_ECB(tmp, key);
    }

你觉得这应该有用吗?现在我将在循环中在C#侧调用此函数,并像在C ++中一样传递偏移量。

2 个答案:

答案 0 :(得分:0)

如果您使用LINQ扩展并编写inBuff.Skip(i),您将获得一个IEnumerable,它以i inBuff元素开头的元素。除非你调用ToList方法,否则不会出现复制和额外的内存分配,但你可以对待和使用新的IEnumerable,就像它是一个子阵列一样。

答案 1 :(得分:0)

更新后:

最简单的解决方案是获取你的inBuff和outBuff的某种子数组,然后执行你的DecryptDES_ECB() - 函数,然后将结果复制到原始数组中。

public static void DecryptDES_ECB(byte[] ciphertext, byte[] decryptedtext, int cipherOffset, byte[] key)
{
    byte [] tmpCipher = new byte [ciphertext.Length - cipherOffset];
    Array.copy(ciphertext, cipherOffset, tmpCipher, 0, tmpCipher.Length);
    byte [] tmpDecrypt = DecryptDES_ECB(tmp, key);
    Array.copy(tmpDecrypt, 0, decryptedtext, cipherOffset, tmpDecrypt.Length);
}

此方法已经过测试,我不知道底层库,因此无法保证其正确性。但通常情况下,这将是解决您的一般问题的一种简单(但相当慢)的尝试。

编辑: 关于Array.Copy的一些额外信息:它执行memmove内部(通常)执行对memcpy的调用,这非常快。 (通常)比你的循环可能快得多。