【问题标题】:How do I concatenate 2 bytes?如何连接 2 个字节?
【发布时间】:2009-12-20 10:16:08
【问题描述】:

我有 2 个字节:

byte b1 = 0x5a;  
byte b2 = 0x25;

我如何获得0x5a25

【问题讨论】:

  • "add" 不能很好地描述这个操作。连接?

标签: c# byte


【解决方案1】:

可以使用按位运算符'

public int Combine(byte b1, byte b2)
{
    int combined = b1 << 8 | b2;
    return combined;
}

使用示例:

[Test]
public void Test()
{
    byte b1 = 0x5a;
    byte b2 = 0x25;
    var combine = Combine(b1, b2);
    Assert.That(combine, Is.EqualTo(0x5a25));
}

【讨论】:

  • 我很确定你不需要将它包装在一个函数中 :-) 但你是对的,所以 +1。
  • 当心en.wikipedia.org/wiki/Endianness。字节将用于什么真的很重要。尽管大多数 c# 工作都是在 Intel 平台上完成的,但字节可能会作为字节序很重要的网络协议的一部分发送出去。
  • 哦 OR 很好 :-) 但它仍然很短...... OR +1 :)
  • Func 结合; if (BitConverter.IsLittleEndian) { combine = new Func((i, j) => j ((i, j) => i
【解决方案2】:

使用位运算符: (b1 &lt;&lt; 8) | b2 或同样有效的(b1 &lt;&lt; 8) + b2

【讨论】:

    【解决方案3】:

    一种更明确的解决方案(也是一种可能更容易理解和扩展到字节到 int 的解决方案):

    using System.Runtime.InteropServices;
    [StructLayout(LayoutKind.Explicit)]
    struct Byte2Short {
      [FieldOffset(0)]
      public byte lowerByte;
      [FieldOffset(1)]
      public byte higherByte;
      [FieldOffset(0)]
      public short Short;
    }
    

    用法:

    var result = (new Byte2Short(){lowerByte = b1, higherByte = b2}).Short;
    

    这让编译器可以做所有的位摆弄,因为 Byte2Short 是一个结构,而不是一个类,new 甚至不分配一个新的堆对象;)

    【讨论】:

    • 也许——但如果你想表达在位层面上可以不止一种方式理解某事,那么它是首选工具。我个人更喜欢 shift+or 方法,但是当你的目标是 uint64 时它会变得非常麻烦,而在这种情况下联合仍然非常可读。
    • 还有BitConverter.ToUInt16(new[] { b2, b1, }, 0)
    【解决方案4】:
    byte b1 = 0x5a;
    byte b2 = 0x25;
    
    Int16 x=0;
    
    x= b1;
    x= x << 8;
    x +=b2;
    

    【讨论】:

      【解决方案5】:

      最简单的应该是

      b1*256 + b2
      

      【讨论】:

      • (b1
      • @futureelite7,现代编译器不太可能出现这种情况——无论如何,你应该使用 (b1
      • @futureelite7:我注意到b1*256+b2(b1&lt;&lt;8)+b2 少一个字符,所以实际上b1*256+b2 更快。 :-)
      • 这太荒谬了。两者实际上是相同的。运行一万亿条语句使用:c = (a
      【解决方案6】:

      这个问题有点模棱两可。

      如果是字节数组,您可以简单地: 字节[] myarray = 新字节[2]; 我的数组 [0] = b1; 我的数组 [1] = b2; 你可以序列化 byearray...

      或者,如果您尝试将这 16 位填充到 int 或类似内容中,您可以在 c# 中学习按位运算符... http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts

      做类似的事情:

      byte b1 = 0x5a; byte b2 = 0x25; int foo = ((int) b1 &lt;&lt; 8) + (int) b2;

      现在你的 int foo = 0x00005a25。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 2011-02-24
        • 2021-01-03
        • 2011-02-07
        • 2018-03-13
        相关资源
        最近更新 更多