将指针传递给结构体?

时间:2013-06-27 04:23:36

标签: c# pointers unsafe

您好我正在尝试将数据从指针传递给结构但值似乎不同。

struct somestruct
{
    public file header;
    public uint version;
}

unsafe struct file
{
    public fixed char name[8];
    public uint type;
    public uint size;
}

然后在某处代码..

public unsafe int ReadFile(string filepath)
{
    somestruct f = new somestruct();
    byte[] fdata = System.IO.ReadAllBytes( filepath );
    fixed( byte* src = fdata )
    {
        f.header = *(file*)src;
        MessageBox.Show( new string(f.header.name) ); //should be 'FILENAME' but it's like japanese.
    }
    return 0;
}

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  46 49 4C 45 4E 41 4D 45 00 00 00 01 00 00 00 30  FILENAME.......0
00000010  74 27 9F EF 74 77 F1 D7 C5 86 93 3D 39 0D 72 A9  t'Ÿïtwñ×ņ“=9.r©
00000020  63 8B 92 CF F6 7D 8A 14 45 9D 68 51 A4 8E A4 EE  c‹’Ïö}Š.E.hQ¤Ž¤î
00000030  4E FE D0 66 45 0E C9 8D 96 BB F4 EE 52 1F 89 D3  NþÐfE.É.–»ôîR.‰Ó
00000040  5C 80 1A 71 8A 16 B1 8B 3A A8 1B A4 48 11 B8 E8  \€.qŠ.±‹:¨.¤H.¸è

你知道发生了什么吗?

2 个答案:

答案 0 :(得分:3)

每个char是2个字节 - 8个字符的固定缓冲区是16个字节。您正在读取前8个字节,只读取该缓冲区中的前4个字符,高字节将使其显示。与东部Unicode范围一样。

我想说:在流级别反序列化它。不要这样做。

基本上,将(至少)20个字节读入缓冲区,然后使用:

手动解码
string s = Encoding.ASCII.GetString(buffer, 0, 8);

对于字符串,可能是无符号整数的移位操作。

您还可以使用unsafe代码从缓冲区读取整数,通过fixed和指针强制转换的其他含义。

答案 1 :(得分:2)

char是UTF-16,是2个字节。您需要将UTF-8 / ANSI(1字节)字符串转换为UTF-16字符串。