c# - Marshal.Sizeof 和 BitConverter.GetBytes 对 boolean 值的行为不同

标签 c# boolean sizeof bitconverter

让我们考虑一下这段代码:

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 采用 boolean 值作为输入: enter image description here

最佳答案

两种测量 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;
}

Source .

因此它总是返回一个单元素数组。

您可能需要的是 sizeof(byte),它“返回给定类型的变量占用的字节数”( MSDN )。 sizeof(bool) 返回 1

关于c# - Marshal.Sizeof 和 BitConverter.GetBytes 对 boolean 值的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58322746/

相关文章:

c# - Powerpoint 2010 多个实例

c# - 用一组 8 个 boolean 值找到正确组合的最快方法

c++ - alignof(T*) 对于所有可能的类型都相同吗? sizeof(T*) 呢?

java - 如果温度对象表示低于冰点的温度,则返回 true 的方法(JAVA)

c - sizeof(&array)返回什么?

c++ - 我应该怎么做才能获得 'dynamic' 数组的大小?

c# - for循环中的sql

c# - 如何在 XNA 3.1 中导出模型的 3D "screenshot"?

c# - 我可以在 VB.NET 中使用带有不安全代码的 C# dll 吗?

将一个字节转换为 8 个 boolean 值