10

我正在使用BitConverter.GetBytes()将各种变量(不同类型的)转换为字节数组,以将其传递给我需要检查每个字节的值的自定义方法。

我注意到我可以将一个类型的变量传递byteBitConverter.GetBytes()(即使它没有在重载列表中列出:参见相关的 MSDN 页面),在这种情况下,我总是有一个 2 字节数组作为返回值。我不应该有一个单字节数组作为返回值吗?.NET 如何解释字节参数?

样本:

byte arg = 0x00;
byte[] byteArr = BitConverter.GetBytes(arg);
// Result: byteArr is a 2-bytes array where byte[0] = 0 and byte[ 1] = 0
4

4 回答 4

14

当您查找GetBytes()时,您会发现没有带byte参数的重载。

您正在查看最接近匹配的结果,GetBytes(Int16)这当然会产生byte[2].

换句话说,您的代码:

byte arg = 0x00;
byte[] byteArr = BitConverter.GetBytes(arg);

相当于:

byte arg = 0x00;
short _temp = arg;
byte[] byteArr = BitConverter.GetBytes(_temp);
于 2013-10-17T16:39:47.263 回答
4

正如其他答案所指出的那样,没有 GetBytes 采用字节参数的重载。下一个问题是为什么它会选择需要做空的重载。它可以选择其中任何一个,例如:

GetBytes(short)
GetBytes(int)
GetBytes(long)
GetBytes(float)
...

它选择short的原因不仅仅是因为short是下一个最接近的东西。这背后有更好的推理。C# 语言规范解释:

“给定从类型 S 转换为类型 T1 的隐式转换 C1,以及从类型 S 转换为类型 T2 的隐式转换 C2,两种转换的更好转换确定如下”[1]

以下是从 S 到 T1 或 T2 的两种可能的转换:

      S         
C1   byte     short (T1)
C2   byte     int   (T2)

在这里有效的规则是:

“如果存在从 T1 到 T2 的隐式转换,并且不存在从 T2 到 T1 的隐式转换,则 C1 是更好的转换。”

存在从 short 到 int 的隐式转换,但不是从 int 到 short 的转换,因此选择了从 byte 到 short 的转换。

[1] http://msdn.microsoft.com/en-us/library/aa691339 (v=vs.71).aspx(旧版)

于 2013-10-17T17:05:11.643 回答
1

它实际上是使用重载 forshort而不是byte,这意味着它将您的字节向上转换为 a short,它有 2 个字节长。

于 2013-10-17T16:40:49.310 回答
1

没有GetBytes接受 a 的重载byte

但是,C# 语言规范的第 6.1.2 节说存在隐式数字转换

• 从字节到short、ushort、int、uint、long、ulong、float、double 或decimal。

这会导致编译器将其转换byteshort(即 2 个字节),从而导致该方法返回一个 2 字节数组。

于 2013-10-17T16:43:40.960 回答