无符号字符*-等价于C# 我正在从C++到C语言移植一个库,但是遇到了一个我不确定如何解决的场景,它涉及到一个未签名的char */Cube >到未签名的int */COD>。p>

无符号字符*-等价于C# 我正在从C++到C语言移植一个库,但是遇到了一个我不确定如何解决的场景,它涉及到一个未签名的char */Cube >到未签名的int */COD>。p>,c#,c++,C#,C++,C++ 无符号整数c4; 无符号整数c2; 无符号整数h4; int pos(无符号字符*p) { c4=*(重新解释铸造(p-4)); c2=*(重新解释铸造(p-2)); h4=((c4>>11)^c4)和(N4-1); if((tab4[h4][0]!=0)和&(tab4[h4][1]==c4)) { c=256; 返回(表4[h4][0]); } c=257; 返回(表2[c2]); } (这是错误的): public uint pos(字节p) { c4=(uint)(p-4); c

C++

无符号整数c4;
无符号整数c2;
无符号整数h4;
int pos(无符号字符*p)
{
c4=*(重新解释铸造(p-4));
c2=*(重新解释铸造(p-2));
h4=((c4>>11)^c4)和(N4-1);
if((tab4[h4][0]!=0)和&(tab4[h4][1]==c4))
{
c=256;
返回(表4[h4][0]);
}
c=257;
返回(表2[c2]);
}
(这是错误的):

public uint pos(字节p)
{
c4=(uint)(p-4);
c2=(ushort)(p-2);

H4=((C4>> 11)^ C4)和(1)P> C++中的代码,您发送指针到字符,但通常C ^不使用这种方式使用内存,需要数组而不是指针。 但是您可以使用
unsafe
关键字直接使用内存。
问题行的翻译应为:

int pos(byte[] a, int offset)
{
    // Read the four bytes immediately preceding offset
    c4 = BitConverter.ToUInt32(a, offset - 4);
    // Read the two bytes immediately preceding offset
    c2 = BitConverter.ToUInt16(a, offset - 2);
< >更改从<代码> x= POS(和BUF[i])< /> >(甚至在C++中与<代码> x= POS(Buf+i) >相同的调用到


一个重要的注意事项是,现有C++代码是错误的,因为它违反了严格的混叠规则。

< P>在C语言中实现类似的功能不需要涉及在语句的基础上复制C版本的代码,尤其是当原件使用指针时。 当我们假设
int
为32位的体系结构时,可以将C版本简化为:

uint[] tab2;
uint[,] tab4;
ushort c;

public uint pos(uint c4)
{
    var h4 = ((c4 >> 11) ^ c4) & (1 << 20 - 1);
    if ((tab4[h4, 0] != 0) && (tab4[h4, 1] == c4))
    {
        c = 256;
        return (tab4[h4, 0]);
    }
    else
    {
        c = 257;
        var c2 = (c4 >> 16) & 0xffff; // HIWORD
        return (tab2[c2]);
    }
}
uint[]表2;
uint[,]tab4;
ushort c;
公共单元位置(单元c4)
{
var h4=((c4>>11)^c4)和(1>16)&0xffff;//HIWORD
返回(表2[c2]);
}
}
这种简化是可能的,因为c4和c2重叠:c2是c4的高位字,只有在
tab4
中的查找不匹配时才需要


(标识符
N4
出现在原始代码中,但在您自己的翻译中被表达式1替换。p-4和p-2中的指针算法需要查看调用上下文,然后我们才能尝试为C#等价物定义正确的签名。
p
的内存布局是什么ce?您可以使用BitConverter类。C++/CLI不是Mono上的选项,也不是.NET Core上的选项。@dlatikay谢谢您的评论。P的上下文是一个无符号字符[1让它流动,@πάνταῥεῖ. 我们有一种方法来帮助OP,没有任何代码> RealTytCase< /Cuff.Office。它看起来像一个干净的端口,没有指针算法或<代码>不安全< /代码>是可行的。当我注意到在C++中的<代码> INT/C> > 32位宽的体系结构时,我就停止了自己的答案。在这种情况下,C2不只是C4的下层单词?@ DLATKYAY:是的,它重叠。在C++代码中也有。(在使用C语言的体系结构中,<代码> C2 < /代码>将是更高的单词,而不是更低,但您的观察结果基本上是正确的)可爱的干净的解决方案。谢谢!另外,@ DLATKA也谢谢您的帮助。
int pos(byte[] a, int offset)
{
    // Read the four bytes immediately preceding offset
    c4 = BitConverter.ToUInt32(a, offset - 4);
    // Read the two bytes immediately preceding offset
    c2 = BitConverter.ToUInt16(a, offset - 2);
x = pos(buf, i);
uint[] tab2;
uint[,] tab4;
ushort c;

public uint pos(uint c4)
{
    var h4 = ((c4 >> 11) ^ c4) & (1 << 20 - 1);
    if ((tab4[h4, 0] != 0) && (tab4[h4, 1] == c4))
    {
        c = 256;
        return (tab4[h4, 0]);
    }
    else
    {
        c = 257;
        var c2 = (c4 >> 16) & 0xffff; // HIWORD
        return (tab2[c2]);
    }
}