Как объединить 2 байта? - PullRequest
       16

Как объединить 2 байта?

10 голосов
/ 20 декабря 2009

у меня 2 байта:

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

Как мне получить 0x5a25?

Ответы [ 6 ]

36 голосов
/ 20 декабря 2009

Это можно сделать, используя побитовые операторы '<<' и '|' </p>

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));
}
17 голосов
/ 20 декабря 2009

Использование битовых операторов: (b1 << 8) | b2 или так же эффективно (b1 << 8) + b2

5 голосов
/ 20 декабря 2009

Более явное решение (также более простое для понимания и расширенное для байтов до int i.e.):

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 является структурой, а не классом, новая даже не выделяет новый объект кучи;)

1 голос
/ 20 декабря 2009
byte b1 = 0x5a;
byte b2 = 0x25;

Int16 x=0;

x= b1;
x= x << 8;
x +=b2;
0 голосов
/ 20 декабря 2009

Вопрос немного двусмысленный.

Если байтовый массив, вы можете просто: byte [] myarray = новый байт [2]; myarray [0] = b1; myarray [1] = b2; и вы могли бы сериализовать byrayray ...

или если вы пытаетесь сделать что-то вроде вставки этих 16 битов в int или подобное, вы можете изучить свои побитовые операторы в c # ... http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts

сделать что-то похожее на:

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

теперь ваш int foo = 0x00005a25.

0 голосов
/ 20 декабря 2009

Самый простой будет

b1*256 + b2
...