2013-06-27 156 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會非常簡單...但我們必須與代理對一起生活。 :) –