C # получает первые 2 целых числа из байтового массива - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть байт [], подобный этому

byte[] buffer = new byte[1024];

этот байт [] может иметь следующие значения:

buffer = {0, 0, 0, 106, 0, 0, 0, 11, 64, 33, 50, 32, 32, 32, ....}

Я пытаюсь получить первые 8 байтов, то есть:

0,0,0,106

0,0,0,11

и преобразовать их в целые числа, равные 106 и 11.

Я могу смело предположить, что первые 8байты всегда представляют 2 целых числа, как в примере выше, это 106 и 11, и они принимают форму 4 байтов с 1-м 3, равным 0, как указано выше.

Оба являются 4-байтовыми целыми числами со знаком в Hi-Loзаказ

Как мне это сделать в C #?

Ответы [ 5 ]

0 голосов
/ 20 февраля 2019

Простая функция DIY:

int BytesToInt32(byte[] buff, int offset)
{
    return (buff[offset + 0] << 24)
         + (buff[offset + 1] << 16)
         + (buff[offset + 2] << 8)
         + (buff[offset + 3]);
}

, а затем:

buffer = {0, 0, 0, 106, 0, 0, 0, 11, 64, 33, 50, 32, 32, 32, ....};
int a = BytesToInt32(buffer, 0);
int b = BytesToInt32(buffer, 4);
0 голосов
/ 20 февраля 2019

Все, что вам нужно, - это получить доступ к индексам 3 и 7:

int first = buffer[3];
int second = buffer[7];

Существует неявное преобразование из byte в int.

Это возможно из-за следующего:

Я могу с уверенностью предположить, что [...] они принимают форму 4 байтов, где 1st 3 равно 0 *

Поэтому вам нужно толькопоследний байт каждого 4-байтового целого числа.

0 голосов
/ 20 февраля 2019

Я бы преобразовал ваш byte[] в MemoryStream (или оставил бы его как Stream).Затем используйте BinaryReader в зависимости от ситуации.Если порядковый номер не верен: C # - двоичный ридер в Big Endian?

0 голосов
/ 20 февраля 2019
private static int BytesToInt(byte[] array, int startIndex){
    int toReturn = 0;
    for (int i = startIndex; i < startIndex + 4; i++)
    {
        toReturn = toReturn << 8;
        toReturn = toReturn + array[i];
    }
    return toReturn;
}
0 голосов
/ 20 февраля 2019

Используйте класс преобразования.

int myint1 = Convert.ToInt32(buffer[someIndex1]);
int myint2 = Convert.ToInt32(buffer[someIndex2]);

Как уже упоминалось, если гарантировано, что индекс 4 и индекс 7 имеют ненулевые байты, вы можете просто подключить его напрямую.

...