0

私は構造体を持っています:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct FieldIndex {
   public fixed byte Meta[16];
}

最初のバイトはTypeCode. 残りの 15 バイトは、UTF8 でエンコードされた文字列です。

nameBuf以下を使用してバイト配列を埋めています。

  private static string GetMetaName (FieldIndex meta) {
     var idx = 0;
     var bytesOut = 1;
     var nameBuf = new byte[Indexer.MAXFIELDNAMELENGTH];   // 15

     while (bytesOut < Indexer.MAXFIELDLENGTH) {           // 16
        nameBuf[idx] = *(byte*)((byte*)&meta + bytesOut);

        ++bytesOut;
        ++idx;
     }

     //var src = (byte*)&field.meta + 1;
     //fixed (byte* b = nameBuf) {
     //   *((byte*)b) = (byte)src;
     //}

     return BinaryConverter.ToString(nameBuf, 0, Indexer.MAXFIELDNAMELENGTH, Indexer.DefaultEncoding);
  }

上記のコメント付きのコードでは、while反復なしで同じタスクを達成しようとしていましたが、機能しません (コンパイル エラーではなく、補間が間違っているだけです)。nameBuf-loopなしで割り当てることはできますwhileか?

更新.ではなく.
を使用することもお勧めします。(byte*)Marshal.Copy

4

2 に答える 2

1

次のように簡単に実行できる場合、これをハードで危険な方法で実行してもあまり意味がありません。

[StructLayout(LayoutKind.Sequential)]
struct FieldIndex {
   public byte Typecode;
   [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
   private byte[] Utf8string;
   public string GetString() {
      return Encoding.UTF8.GetString(Utf8string, 0, 15);
   }
}

while ループはありません。ミッションは完了しました。そのポインターはまだそこにあり、同じように効率的です。もう表示されないだけです。GetString() メソッドを頻繁に呼び出すことに不安がある場合は、単に別のパブリック クラスを宣言し、これを内部に保持します。

于 2015-10-02T17:18:32.483 に答える