1

我目前正在尝试将此 C 代码转换为 C#。
由于我对 C 不是很熟悉,因此非常感谢您的帮助!

static unsigned char byte_table[2080] = {0};

首先,一些字节数组被声明但从未填充,我可以接受

BYTE* packet = //bytes come in here from a file
int unknownVal = 0;
int unknown_field0 = *(DWORD *)(packet + 0x08);
do
{
    *((BYTE *)packet + i) ^= byte_table[(i + unknownVal) & 0x7FF];
    ++i;
}
while (i <= packet[0]);

但是在这里..我真的不知道如何将其转换为 C#
BYTE = byte[] 对吗?
DWORD = 双倍?
但是如何翻译 (packet + 0x08) 呢?如何将十六进制添加到字节数组?哦

,我会很高兴有任何帮助!:)

4

1 回答 1

1

在 C 中{0},如果我没记错的话,将任何一组内存设置为会将整个内存区域设置为零。

可以以更简单、对 C# 友好的方式重写该底部循环。

byte[] packet = arrayofcharsfromfile;
int field = packet[8]+(packet[9]<<8)+(packet[10]<<16)+(packet[11]<<24); //Assuming 32 bit little endian integer
int unknownval = 0;
int i = 0;

do //Why waste the newline? I don't know. Conventions are silly!
{
    packet[i] ^= byte_table[(i+unknownval) & 0x7FF];
} while( ++i <= packet[0] );

field通过获取包括索引 8 在内的四个字节并从它们生成一个 32 位 int 来设置。

在 C 中,您可以将指针转换为其他类型,就像在您提供的代码段中所做的那样。他们正在做的是获取一个字节数组(每个字节的大小为 DWORD 的 1/4)并将 8 添加到索引中,从而使指针前进 8 个字节(因为每个元素都是一个字节宽),然后处理该指针作为 DWORD 指针。简单来说,他们将字节数组转换为 DWORD 数组,然后将索引 2 设为8/4=2.

正如我在上面演示的那样,您可以通过将字节串在一起以及位移和加法以安全的方式模拟这种行为。它没有那么高效,也没有那么漂亮,但它完成了同样的事情,而且也是以与平台无关的方式。并非所有平台都是小端。

于 2013-02-04T19:56:50.990 回答