GetBytes函数如何工作?

Sca*_*avs 13 c# primitive bytearray bitconverter

我编写了自己的类,将C#标准基元转换为字节数组.

后来,我看了一下BitConverter,看看专业人士是如何做到的.

我的代码示例:

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

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

    return bytes;
}
Run Code Online (Sandbox Code Playgroud)

BitConverter类代码:

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

为什么他们的功能被标记为不安全并使用固定运算符?

即使这些功能使用不安全,这些功能是否容易出错?我应该放弃我的并实施它们吗?哪个更有效率?

Gaz*_*yer 12

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

它更有效,因为它通过将字节数组转换为短指针来一次复制两个字节.要做到这一点,它需要修复以允许使用指针,因此不安全的关键字.

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

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

库函数也不容易出错,因为它们已经被数百万开发人员每天使用它们进行了战斗,而你的函数只经过了你的测试.

  • @Scavs只有那些已经顺利旋转的轮子:) (4认同)
  • @Scavs对于`String`你应该使用`System.Text.Encoding.GetBytes`(https://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes(v=vs.110). aspx),而不是BitConverter. (3认同)
  • "BitConverter"中的整数转换函数很少有用.如果解析文件或编写通信协议,则使用本机字节序会导致平台依赖.在处理本机数据结构时,通常有更好的选择,例如编组器或定义结构并转换指针.它的顶部很慢. (2认同)
  • 修复指针非常慢(它固定对象).这绝不是有效的.二进制读/写类将每个字节放在一个字节数组中,就像OP的方法一样:http://referencesource.microsoft.com/#mscorlib/system/io/binarywriter.cs,258 (2认同)