C到C#Bytearray + hex

时间:2013-02-04 18:31:04

标签: c# c bytearray

我目前正在尝试将此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 = double?
但如何(包+ 0x08)翻译?如何在字节数组中添加十六进制?吴

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

1 个答案:

答案 0 :(得分: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)并从索引8开始生成32位int来设置。

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

如上所述,您可以通过将字节串位与位移和添加一起以安全的方式模拟此行为。它不是那么有效而且不那么漂亮,但它完成同样的事情,并且也以平台无关的方式完成。并非所有平台都是小端。