2013-06-27 4 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 символа в этом буфере, и высокие байты заставляют его смотреть. Как восточные диапазоны Юникода.

Я бы сказал: десериализуйте его на уровне потока. Не делай этого.

В основном, следующим образом (по крайней мере) 20 байт в буфер, затем декодировать вручную, с помощью:

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

Для строки, и, возможно, перенести операции для целых чисел без знака.

Вы также можете использовать код unsafe для чтения целых чисел из буфера, с помощью другого значения fixed и указателя.

+0

Я понял, я просто преобразовал байт * в байт [] и использовал Encoding.ASCII.GetString. (например, выше), спасибо всем парням помощи. Кажется, что глупо, что char - это 2 байта вместо 1.:/ – user1594121

+1

@user, если это кажется «глупым», то это означает, что вы не знаете, что такое 'char' * is * - это utf-16 ** unicode ** character - 'wchar' вам. Если вам нужны 8-битные данные, используйте 'byte []' или аналогичные. –

+1

+1. @ user1594121 согласны с тем, что 'char' как 2 байта не является оптимальным. 4 было бы так просто ... Но вместо этого мы должны жить с суррогатной парой. :) –

Смежные вопросы