【问题标题】:How do I convert an int to two bytes in C#?如何在 C# 中将 int 转换为两个字节?
【发布时间】:2010-10-12 23:23:06
【问题描述】:

如何在 C# 中将 int 转换为两个字节?

【问题讨论】:

  • int 的哪一部分?两个字节不足以编码整个 32 位整数值。
  • int 需要 4 个字节进行存储。您希望丢失 MSB 中的信息吗?
  • 谁 beep 否决了这个。这是一个有用且有趣的问题,因为 C 方式突然在 C# 中无缘无故地不起作用,并且明显的 API 不存在(BitConverter 很慢并且在许多方面损坏)。跨度>
  • @Joshua 如果你切换到“不安全”的 c#,那么 c 的方式会起作用
  • @Joshua:它可能有用,也可能没有,但它的指定也很差。问题建议int/Int32,在这种情况下,OP 是否需要最签名的对?最少签名对?每个?某种深奥的异或?我还没有投反对票……

标签: c# byte int


【解决方案1】:

假设你只想要低字节:

byte b0 = (byte)i,
     b1 = (byte)(i>>8);

但是,由于 'int' 是 'Int32',因此还有 2 个字节未被捕获。

【讨论】:

  • 这是我的解决方案。必须比 BitConverter 快得多。
  • @Joshua,我做了一个快速基准测试(发布版本,50000000 次迭代,秒表和完整测试重复两次以消除各种伪影)以及创建数组和使用位掩码与. 在我的机器上每次调用 BitConverter 大约需要 1ns。如果去掉数组创建(只取两个字节),相差约14ns。
  • 我不怀疑你的基准。相比之下,BitConverter 比较慢,因为它必须分配数组。如果我可以预先检测数千个整数的数组大小,我可以节省大量时间。
  • @Joshua,不平凡当然是相对的。在 14ns 的差异下,您必须执行 100 万次迭代才能观察到额外数组分配的 14ms 延迟。 CLR 为小型临时对象分配的内存实际上非常便宜。这是垃圾收集器设计的结果,它在收集期间压缩堆,允许分配而不需要处理碎片。
  • @Joshua - 这不是 Mono 的问题 - 它是不同的字节序。 shift 方法完全避开了这一点(我假设 Mono 评论是针对 BitConverter,而不是 shift?)
【解决方案2】:

您可以使用BitConverter.GetBytes 来获取组成 Int32 的字节。结果将有 4 个字节,但不是 2 个。

【讨论】:

    【解决方案3】:

    另一种方法,虽然不像其他方法那样巧妙:

    Int32 i = 38633;
    byte b0 = (byte)(i % 256);
    byte b1 = (byte)(i / 256);
    

    【讨论】:

    • 你能解释一下如何使用这个解决方案从 2 个字节中取回整数
    【解决方案4】:

    它是 int16 吗?

    Int16 i = 7;
    byte[] ba = BitConverter.GetBytes(i);
    

    这将只有两个字节。

    【讨论】:

      【解决方案5】:

      选项 1:

      byte[] buffer = BitConverter.GetBytes(number);
      

      选项 2:

      byte[] buffer = new byte[2];
      
      buffer[0] = (byte) number;
      buffer[1] = (byte)(number >> 8);
      

      我更喜欢选项 1!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-10
        • 2012-08-08
        • 2011-02-12
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多