2013-06-27 155 views
1

你好我试图将数据从一个指针传递给一个结构,但值看起来不一样。将指针传递给结构?

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.¸è 

你有任何想法,这是怎么回事?

+1

你为什么用指针解决这个问题? – TGH

+0

,因为指针速度更快,并且使用更少的代码添加到结构中。这是我比C#更喜欢C++的原因之一,但我想为这个项目做C#。 :) – user1594121

回答

2

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

3

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

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

基本上,读(至少)20个字节到缓冲区,然后手动进行解码,使用:

string s = Encoding.ASCII.GetString(buffer, 0, 8); 

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

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

+0

我知道了,我只是将字节*转换为字节[]并使用Encoding.ASCII.GetString。 (如上),感谢所有的帮助家伙。似乎有点愚蠢,一个字符是2个字节,而不是1.:/ – user1594121

+1

@user如果它看起来“哑”,那么这意味着你不清楚'char' *是什么* - 它是一个utf-16 ** unicode **字符 - “wchar”给你。如果你想要8位数据,使用'byte []'或类似的。 –

+1

+1。 @ user1594121同意'char'为2个字节不是最优的。 4会非常简单...但我们必须与代理对一起生活。 :) –