gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:28:29 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com