Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将(字节*+;偏移量)分配给字节[]?_C#_Buffer_Bytearray_Unsafe Pointers - Fatal编程技术网

C# 如何将(字节*+;偏移量)分配给字节[]?

C# 如何将(字节*+;偏移量)分配给字节[]?,c#,buffer,bytearray,unsafe-pointers,C#,Buffer,Bytearray,Unsafe Pointers,我有一个结构: [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

我有一个结构:

[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);
  }
私有静态字符串GetMetaName(FieldIndex meta){
var-idx=0;
var bytesOut=1;
var nameBuf=新字节[Indexer.MAXFIELDNAMELENGTH];//15
而(bytesOut
在上面的注释代码中,我试图在没有
while
迭代的情况下完成相同的任务,但它不起作用(没有编译错误,只是插值错误)。我是否可以在不使用while
循环的情况下分配
nameBuf

更新
我还更喜欢使用
(byte*)
而不是
封送。复制

您可以尝试在
不安全的
上下文中使用静态方法:

unsafe
{
    Marshal.Copy(new IntPtr(meta), nameBuf, 1, nameBuf.Length);
}

如果你可以轻松地做到这一点,那么用硬而不安全的方式做这件事没有多大意义:

[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);
   }
}

没有循环,任务完成了。指针仍然在那里,同样有效,你只是看不到它了。如果您过于频繁地调用GetString()方法而烦恼,那么只需声明另一个公共类并将该类保持在内部。

不会封送。复制
只需隐藏
循环(本质上)?别介意这个问题。我看了一下实现,它调用了一个
extern
方法(可能是C),很可能与Mono在这里所做的非常相似:我正在寻找一种方法,在不使用
封送
的情况下使用
字节*+偏移量
。我会更新我的问题,看看我是否能得到它。
Marshal.Copy
实际上导致了一个异常:越界。您编写该实现时,它给出了一个编译错误,因此我对它做了一些修改:
Marshal.Copy(新的IntPtr((byte*)&meta),nameBuf,1,nameBuf.Length)