Marshal.Sizeof 和 BitConverter.GetBytes 在布尔值上的表现不同
Marshal.Sizeof and BitConverter.GetBytes behave differently on booleans
让我们考虑这段代码:
static void Main(string[] args)
{
Console.WriteLine(Marshal.SizeOf(typeof(bool)));
Console.WriteLine(String.Join(", ", BitConverter.GetBytes(true)));
}
如果 bool 是 1 个字节,我希望它输出
1
1
如果 bool 是 4 个字节(作为 int),我希望
4
1, 0, 0, 0 // let's forget about the endianness
但是,它输出(在 x64 中)
4
1
这对我来说是编组代码中的一个大问题。我应该相信谁?
请注意 GetBytes 将布尔值作为输入:
你测量 bool
大小的两种方法都有缺陷。
Marshal.SizeOf
用于确定将给定类型编组为非托管代码时占用的内存量。 bool
被编组为 windows BOOL
类型,即 4 个字节。
BitConverter.GetBytes(bool)
是这样有效实现的:
public static byte[] GetBytes(bool value) {
byte[] r = new byte[1];
r[0] = (value ? (byte)1 : (byte)0 );
return r;
}
因此它总是returns一个单元素数组。
您可能想要的是 sizeof(byte)
,即 "returns the number of bytes occupied by a variable of a given type" (MSDN)。 sizeof(bool)
returns 1
.
这里的情况是 Marshal.SizeOf returns unmanaged 类型的大小(以字节为单位)和 unmanaged 等效布尔值是 4 字节 Win32 BOOL类型。有关详细信息,请参阅
让我们考虑这段代码:
static void Main(string[] args)
{
Console.WriteLine(Marshal.SizeOf(typeof(bool)));
Console.WriteLine(String.Join(", ", BitConverter.GetBytes(true)));
}
如果 bool 是 1 个字节,我希望它输出
1
1
如果 bool 是 4 个字节(作为 int),我希望
4
1, 0, 0, 0 // let's forget about the endianness
但是,它输出(在 x64 中)
4
1
这对我来说是编组代码中的一个大问题。我应该相信谁?
请注意 GetBytes 将布尔值作为输入:
你测量 bool
大小的两种方法都有缺陷。
Marshal.SizeOf
用于确定将给定类型编组为非托管代码时占用的内存量。 bool
被编组为 windows BOOL
类型,即 4 个字节。
BitConverter.GetBytes(bool)
是这样有效实现的:
public static byte[] GetBytes(bool value) {
byte[] r = new byte[1];
r[0] = (value ? (byte)1 : (byte)0 );
return r;
}
因此它总是returns一个单元素数组。
您可能想要的是 sizeof(byte)
,即 "returns the number of bytes occupied by a variable of a given type" (MSDN)。 sizeof(bool)
returns 1
.
这里的情况是 Marshal.SizeOf returns unmanaged 类型的大小(以字节为单位)和 unmanaged 等效布尔值是 4 字节 Win32 BOOL类型。有关详细信息,请参阅