1

現在、この C コードを C# に変換しようとしています。
私は C にあまり詳しくないので、あなたの助けに感謝します!

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

まず、一部の bytearray が宣言されますが、満たされることはありません。

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 = ダブル?
しかし、(パケット + 0x08) はどのように変換できますか? bytearray に 16 進数を追加するにはどうすればよいですか? おお

、何かお役に立てば幸いです!:)

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 を含む 4 バイトを取得し、それらから 32 ビットの int を生成することによって設定されます。

C では、提供されたスニペットで行われているように、ポインターを他の型にキャストできます。彼らが行っているのは、バイト配列 (それぞれが DWORD のサイズの 1/4) を取得し、インデックスに 8 を追加して、ポインターを 8 バイト進めます (各要素はバイト幅であるため)。次に、そのポインターを処理します。 DWORD ポインタとして。簡単に言えば、バイト配列を DWORD 配列に変換し、インデックス 2 を8/4=2.

上記で説明したように、ビットシフトと加算を使用してバイトをつなぎ合わせることで、安全な方法でこの動作をシミュレートできます。それほど効率的ではなく、きれいではありませんが、同じことをプラットフォームに依存しない方法で実現します。すべてのプラットフォームがリトル エンディアンであるとは限りません。

于 2013-02-04T19:56:50.990 に答える