Int到字节数组

Bra*_*itz 56 .net c# bytearray int32

我以为.net有一些简单的转换方法用于将int转换为字节数组?我做了一个快速搜索,并且所有解决方案都是位屏蔽/一次移位一个字节,如"好日子".在某处没有ToByteArray()方法吗?

Mar*_*ell 95

byte[] bytes = BitConverter.GetBytes(i);
Run Code Online (Sandbox Code Playgroud)

虽然请注意,您可能需要检查BitConverter.IsLittleEndian以查看将要出现的方式!

请注意,如果您反复执行此操作,则可能希望通过移位操作(>>/ <<)或使用unsafe代码自行编写来避免所有这些短期数组分配.转换操作具有以下优势:它们不受平台字节序的影响; 你总是按照你期望的顺序得到字节.

  • +1:为清楚起见,我会用"big-endian"替换"[...]按照你期望的顺序". (2认同)

Chr*_*lor 33

Marc的回答当然是正确的答案.但自从他提到移位运算符和不安全代码作为替代.我想分享一个不太常见的选择.使用带Explicit布局的结构.这在原理上类似于C/C++ union.

下面是一个结构示例,可用于获取Int32数据类型的组件字节,好处是它是双向的,您可以操作字节值并查看对Int的影响.

  using System.Runtime.InteropServices;

  [StructLayout(LayoutKind.Explicit)]
  struct Int32Converter
  {
    [FieldOffset(0)] public int Value;
    [FieldOffset(0)] public byte Byte1;
    [FieldOffset(1)] public byte Byte2;
    [FieldOffset(2)] public byte Byte3;
    [FieldOffset(3)] public byte Byte4;

    public Int32Converter(int value)
    {
      Byte1 = Byte2 = Byte3 = Byte4 = 0;
      Value = value;
    }

    public static implicit operator Int32(Int32Converter value)
    {
      return value.Value;
    }

    public static implicit operator Int32Converter(int value)
    {
      return new Int32Converter(value);
    }
  }
Run Code Online (Sandbox Code Playgroud)

现在可以如下使用上述内容

 Int32Converter i32 = 256;
 Console.WriteLine(i32.Byte1);
 Console.WriteLine(i32.Byte2);
 Console.WriteLine(i32.Byte3);
 Console.WriteLine(i32.Byte4);

 i32.Byte2 = 2;
 Console.WriteLine(i32.Value);
Run Code Online (Sandbox Code Playgroud)

当然,不变性警察可能不会对最后的可能性感到兴奋:)