C到C#Bytearray+十六进制

本文关键字:十六进制 C#Bytearray+ | 更新日期: 2023-09-27 17:57:26

我目前正在尝试将这段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=双
但是如何翻译(数据包+0x08)呢?如何向字节数组添加十六进制?Oo

我会为任何有帮助的事情感到高兴!:)

C到C#Bytearray+十六进制

在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] );

CCD_ 2是通过取包括和跟随索引8的四个字节并从中生成32位int来设置的。

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

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