【问题标题】:How does the GetBytes function work?GetBytes 函数是如何工作的?
【发布时间】:2015-11-08 13:01:56
【问题描述】:

我编写了自己的类,它将 C# 标准原语转换为字节数组。

后来,我查看了BitConverter 类source,看看专业人士是如何做到的。

我的代码示例:

public static byte[] getBytes(short value) {
    byte[] bytes = new byte[2];

    bytes[0] = (byte)(value >> 8);
    bytes[1] = (byte)value;

    return bytes;
}

BitConverter 类代码:

public unsafe static byte[] GetBytes(short value) 
{ 
    byte[] bytes = new byte[2];
    fixed(byte* b = bytes) 
        *((short*)b) = value;
    return bytes;
}

为什么它们的函数被标记为不安全并使用固定运算符?

即使它们使用不安全,这些函数是否容易出错?我应该放弃我的并使用他们的实现吗?哪个效率更高?

【问题讨论】:

  • 这些函数做不同的事情:前者使用大端,后者使用原生端。

标签: c# bytearray primitive bitconverter


【解决方案1】:

是的,放弃你的并使用标准库。

它更有效,因为它通过将字节数组转换为短指针来一次复制两个字节。为此,它需要修复以允许使用指针,因此需要使用 unsafe 关键字。

在您自己的程序集中通常应避免使用不安全代码,因为这意味着您的代码无法保证安全,因此只能在完全受信任的环境中运行。

但是,由于 Bitconverter 是由 Microsoft 签名的标准 .Net 程序集的一部分,Windows 知道它们没问题。

库函数也不太容易出错,因为每天都有数百万开发人员在使用它们,而您的函数只经过您的测试。

【讨论】:

  • @Scavs 对于String,您应该使用System.Text.Encoding.GetBytes (msdn.microsoft.com/en-us/library/…),而不是BitConverter。
  • 为教育目的重新发明轮子不一定是坏事,只要你知道有更好的东西并且已经测试过(因此你记得将它用于任何“严肃”的目的)。
  • BitConverter 中的整数转换函数很少有用。如果您解析文件或编写通信协议,则其使用本机字节序会导致平台依赖性。在对本机数据结构进行操作时,您通常有更好的选择,例如编组器或定义结构并转换指针。最重要的是它很慢。
  • 修复指针非常慢(它固定对象)。这绝不是有效的。二进制读取器/写入器类将每个字节放入字节数组中,就像 OP 的方法一样:referencesource.microsoft.com/#mscorlib/system/io/…
  • “但是,由于 Bitconverter 是由 Microsoft 签名的标准 .Net 程序集的一部分,Windows 知道它们是可以的” 至少要等到周二的下一个补丁。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 2020-07-18
  • 2017-05-21
  • 2011-04-24
  • 2017-12-08
  • 2020-09-19
  • 2018-06-15
  • 2012-03-22
相关资源
最近更新 更多