如何在C#中将值类型转换为byte ?

我想做相当于这个:

byte[] byteArray; enum commands : byte {one, two}; commands content = one; byteArray = (byte*)&content; 

是的,它现在是一个字节,但考虑我将来要改变它? 如何让byteArray包含内容? (我不在乎复制它)。

BitConverter类可能正是您要找的。 例:

 int input = 123; byte[] output = BitConverter.GetBytes(input); 

如果您的枚举被称为Int32派生类型,您可以先简单地转换它的值:

 BitConverter.GetBytes((int)commands.one); 

要将任何值类型(不仅仅是基本类型)转换为字节数组,反之亦然:

  public T FromByteArray(byte[] rawValue) { GCHandle handle = GCHandle.Alloc(rawValue, GCHandleType.Pinned); T structure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); handle.Free(); return structure; } public byte[] ToByteArray(object value, int maxLength) { int rawsize = Marshal.SizeOf(value); byte[] rawdata = new byte[rawsize]; GCHandle handle = GCHandle.Alloc(rawdata, GCHandleType.Pinned); Marshal.StructureToPtr(value, handle.AddrOfPinnedObject(), false); handle.Free(); if (maxLength < rawdata.Length) { byte[] temp = new byte[maxLength]; Array.Copy(rawdata, temp, maxLength); return temp; } else { return rawdata; } } 

您可以使用BitConverter.GetBytes方法执行此操作。

对于那些不使用BitConverter而对它如何工作感兴趣的人,你可以这样做:

 // Convert double to byte[] public unsafe byte[] pack(double d) { byte[] packed = new byte[8]; // There are 8 bytes in a double void* ptr = &d; // Get a reference to the memory containing the double for (int i = 0; i < 8; i++) { // Each one of the 8 bytes needs to be added to the byte array packed[i] = (byte)(*(UInt64 *)ptr >> (8 * i)); // Bit shift so that each chunk of 8 bits (1 byte) is cast as a byte and added to array } return packed; } // Convert byte[] to double public unsafe double unpackDouble(byte[] data) { double unpacked = 0.0; // Prepare a chunk of memory ready for the double void* ptr = &unpacked; // Reference the double memory for (int i = 0; i < data.Length; i++) { *(UInt64 *)ptr |= ((UInt64)data[i] << (8 * i)); // Get the bits into the right place and OR into the double } return unpacked; } 

实际上,使用BitConverter更容易,更安全,但知道它很有趣!

您也可以只进行一次简单的转换并将其传递给数组构造函数。 它的长度也与BitConverter方法类似。

 new[] { (byte)mode }