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。
- 获取XElement的InnerXml的最佳方法是什么?
- 什么时候应该将我的部件部署到GAC中?
- .NET中的IEqualityComparer <T>中GetHashCode的作用是什么?
- 在覆盖成员时,违反了inheritance安全规则 – SecurityRuleSet.Level2
- Microsoft .NET 4.0完整框架和客户端configuration文件之间的区别
- stream作为WCF返回值 – 谁处置它?
- 找不到可执行的匹配命令dotnet-projectmodel-server
- MVC4风格捆绑给予403
- 是否有Visual Studio的configurationpipe理器的替代/插件?