如何连接2个字节?

jaw*_*wal 10 c# byte

我有2个字节:

byte b1 = 0x5a;  
byte b2 = 0x25;
Run Code Online (Sandbox Code Playgroud)

我怎么得到0x5a25

Eli*_*sha 36

它可以使用按位运算符'<<'和'|'来完成

public int Combine(byte b1, byte b2)
{
    int combined = b1 << 8 | b2;
    return combined;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

  • 谨防http://en.wikipedia.org/wiki/Endianness.这些字节的用途非常重要.尽管大多数c#工作都是在英特尔平台上完成的,但字节可能会作为网络协议的一部分发送出去,而且这些字节很重要. (7认同)
  • 我很确定你不需要在函数中包装它:-)但是你是对的,所以+1. (2认同)

Nic*_*cue 17

使用位运算符: (b1 << 8) | b2或同样有效(b1 << 8) + b2


gha*_*.st 5

一个更明确的解决方案(也可能更容易理解并扩展到byte到int ie):

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

用法:

var result = (new Byte2Short(){lowerByte = b1, higherByte = b2}).Short;
Run Code Online (Sandbox Code Playgroud)

这让编译器可以完成所有的bit-fiddling,因为Byte2Short是一个struct而不是一个类,所以new甚至不会分配一个新的堆对象;)


Pav*_*sky 0

最简单的是

b1*256 + b2
Run Code Online (Sandbox Code Playgroud)

  • @futureelite7,现代编译器不太可能出现这种情况 - 无论如何,您应该使用 (b1&lt;&lt;8)|b2 :-) (3认同)