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

何が起こっているのか分かりますか?

4

2 に答える 2

3

それぞれchar2 バイトです。8 文字の固定バッファは 16 バイトです。最初の 8 バイトは、そのバッファー内の最初の 4 文字のみとして読み取られており、上位バイトが表示されます。東の Unicode 範囲のように。

つまり、ストリーム レベルで逆シリアル化します。これをしないでください。

基本的に、(少なくとも) 20 バイトをバッファーに読み込み、次を使用して手動でデコードします。

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

文字列の場合、おそらく符号なし整数のシフト操作。

コードを使用して、ポインタキャストunsafeの他の意味を介して、バッファから整数を読み取ることもできます。fixed

于 2013-06-27T04:30:43.073 に答える
2

Acharは UTF-16 で、2 バイトです。UTF-8/ANSI (1 バイト) 文字列を UTF-16 文字列に変換する必要があります。

于 2013-06-27T04:30:28.017 に答える