I want to do the equivalent of this:
我想做相当于这个:
byte[] byteArray;
enum commands : byte {one, two};
commands content = one;
byteArray = (byte*)&content;
yes, it's a byte now, but consider I want to change it in the future? how do I make byteArray contain content? (I don't care to copy it).
是的,它现在是一个字节,但考虑我将来要改变它?如何让byteArray包含内容? (我不在乎复制它)。
5 个解决方案
#1
12
The BitConverter class might be what you are looking for. Example:
BitConverter类可能正是您要找的。例:
int input = 123;
byte[] output = BitConverter.GetBytes(input);
If your enum was known to be an Int32 derived type, you could simply cast its values first:
如果您的枚举被称为Int32派生类型,您可以先简单地转换它的值:
BitConverter.GetBytes((int)commands.one);
#2
16
To convert any value types (not just primitive types) to byte arrays and vice versa:
要将任何值类型(不仅仅是基本类型)转换为字节数组,反之亦然:
public T FromByteArray<T>(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;
}
}
#4
1
For anyone who's interested in how it works without using BitConverter
you can do it like this:
对于那些不使用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;
}
In reality it's much easier and safer to use BitConverter
but it's fun to know!
实际上,使用BitConverter更容易,更安全,但知道它很有趣!
#5
0
You can also just do a simple cast and pass it into the array constructor. It also similar in length to the BitConverter
method.
您也可以只进行一次简单的转换并将其传递给数组构造函数。它的长度也与BitConverter方法类似。
new[] { (byte)mode }
#1
12
The BitConverter class might be what you are looking for. Example:
BitConverter类可能正是您要找的。例:
int input = 123;
byte[] output = BitConverter.GetBytes(input);
If your enum was known to be an Int32 derived type, you could simply cast its values first:
如果您的枚举被称为Int32派生类型,您可以先简单地转换它的值:
BitConverter.GetBytes((int)commands.one);
#2
16
To convert any value types (not just primitive types) to byte arrays and vice versa:
要将任何值类型(不仅仅是基本类型)转换为字节数组,反之亦然:
public T FromByteArray<T>(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;
}
}
#3
#4
1
For anyone who's interested in how it works without using BitConverter
you can do it like this:
对于那些不使用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;
}
In reality it's much easier and safer to use BitConverter
but it's fun to know!
实际上,使用BitConverter更容易,更安全,但知道它很有趣!
#5
0
You can also just do a simple cast and pass it into the array constructor. It also similar in length to the BitConverter
method.
您也可以只进行一次简单的转换并将其传递给数组构造函数。它的长度也与BitConverter方法类似。
new[] { (byte)mode }