int到字节数组

我以为.NET有一种简单的转换方法用于将int转换为字节数组? 我做了一个快速的search,所有的解决scheme都是一次掩盖/移动一个字节,就像“好日子”一样。 有没有一个ToByteArray()方法?

byte[] bytes = BitConverter.GetBytes(i); 

不过也要注意,你可能想检查一下BitConverter.IsLittleEndian ,看看哪个方向会出现!

请注意,如果您正在重复这样做,则可能需要通过移位操作( >> / << )或使用unsafe代码来避免所有这些短暂的数组分配。 轮class操作具有不受平台sorting影响的优点; 你总是得到你期望的顺序的字节。

马克的回答当然是正确的答案。 但是因为他提到了转换操作符和不安全的代码作为替代。 我想分享一个不太常见的select。 使用Explicit布局的结构。 这在本质上与C / C ++ union类似。

下面是一个可以用来获取Int32数据types组件字节的结构的例子,好的是它是两种方式,你可以操纵字节值并看到对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); } } 

上面现在可以使用如下

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

当然,不变性警察可能不会为最后的可能性而兴奋:)

这可能是OT,但是如果你正在序列化很多原始types或POD结构,那么.Net的Google Protocol Buffers对你来说可能是有用的。 这解决了上面提到的@Marc的sorting问题,以及其他有用的function。

这里的大部分答案都是“UnSafe”,或者是LittleEndian的安全,BitConverter并不是LittleEndian的安全,因此,在这里构build一个例子(参见PZahra的post),我简单地通过读取字节数组来创buildLittleEndian安全版本BitConverter.IsLittleEndian == true

 void Main(){ Console.WriteLine(BitConverter.IsLittleEndian); byte[] bytes = BitConverter.GetBytes(0xdcbaabcdfffe1608); //Console.WriteLine(bytes); string hexStr = ByteArrayToHex(bytes); Console.WriteLine(hexStr); } public static string ByteArrayToHex(byte[] data) { char[] c = new char[data.Length * 2]; byte b; if(BitConverter.IsLittleEndian) { //read the byte array in reverse for (int y = data.Length -1, x = 0; y >= 0; --y, ++x) { b = ((byte)(data[y] >> 4)); c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30); b = ((byte)(data[y] & 0xF)); c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30); } } else { for (int y = 0, x = 0; y < data.Length; ++y, ++x) { b = ((byte)(data[y] >> 4)); c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30); b = ((byte)(data[y] & 0xF)); c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30); } } return String.Concat("0x",new string(c)); } 

它返回这个:

 True 0xDCBAABCDFFFE1608 

这是进入字节数组的确切的hex。