Я портирую библиотеку с C++ на C#, но столкнулся со сценарием. Я не уверен, как его решить, что связано с литьем unsigned char *
на unsigned int *
.unsigned char * - Equivalent C#
C++
unsigned int c4;
unsigned int c2;
unsigned int h4;
int pos(unsigned char *p)
{
c4 = *(reinterpret_cast<unsigned int *>(p - 4));
c2 = *(reinterpret_cast<unsigned short *>(p - 2));
h4 = ((c4 >> 11)^c4) & (N4 - 1);
if ((tab4[h4][0] != 0) && (tab4[h4][1] == c4))
{
c = 256;
return (tab4[h4][0]);
}
c = 257;
return (tab2[c2]);
}
C# (это не так):
public uint pos(byte p)
{
c4 = (uint)(p - 4);
c2 = (ushort)(p - 2);
h4 = ((c4 >> 11)^c4) & (1 << 20 - 1);
if ((tab4[h4, 0] != 0) && (tab4[h4, 1] == c4)) {
c = 256;
return (tab4[h4, 0]);
}
c = 257;
return (tab2[c2]);
}
Я верю в C# Например, вы могли бы изменить byte p
к byte[]
но я невежествен, когда он придет литьем byte[]
к одно значение uint.
Кроме того, может ли кто-нибудь объяснить мне, почему вы сделали бы unsigned char *
unsigned int *
? Какую цель он имеет?
Любая помощь/толчок к направлению будет очень полезной.
Арифметика указателя, которая происходит с p-4 и p-2, потребует рассмотрения контекста вызова, прежде чем мы сможем даже попытаться определить правильную подпись для эквивалента C#. Какова структура памяти 'p' в источнике? – dlatikay
Вы можете использовать класс BitConverter. – bitbonk
использовать C++/CLI и оставить свой существующий код C++ как есть –