Почему маршалинг байтов из файла в структуру создает азиатский символ, если значение - это явно английский текст в файле? - PullRequest
0 голосов
/ 05 сентября 2018

Я определил структуру в C # и использую Marshal, чтобы заполнить ее данными из файл. Первый атрибут заполняется правильно, но второй атрибут заполняется азиатским символом вместо текста, который явно находится в файле. Соответствующее содержимое файла (первые 14 символов):

Iq? DANAE_FILE

Структура определяется как:

[StructLayout(LayoutKind.Explicit)]
struct DANAE_LS_HEADER
{
    [FieldOffset(0)]
    public float version;

    [FieldOffset(4)]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public char[] ident;
}

Код для чтения файла (levelData.bytes - это байты, считанные из файла):

    int size = Marshal.SizeOf(typeof(DANAE_LS_HEADER));
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.Copy(levelData.bytes, 0, ptr, size);
    DANAE_LS_HEADER o = (DANAE_LS_HEADER)Marshal.PtrToStructure(ptr, 
      typeof(DANAE_LS_HEADER));

Атрибут «version» в структуре читается правильно (1.44), но атрибут «ident» читается как 䅄.

Есть идеи, почему это так и что я могу с этим поделать? Я, возможно, могу ссылаться на полный файл, если это необходимо.

1 Ответ

0 голосов
/ 05 сентября 2018

При сортировке данных из Intptr нам нужно указать Charset как Ansi.

Попробуйте объявить структуру следующим образом:

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct DANAE_LS_HEADER
{
    public float version;

    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
    public char[] ident;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...