我需要将此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 ++中一样传递偏移量。
答案 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
的调用,这非常快。 (通常)比你的循环可能快得多。