С# получение первых двух целых чисел из массива байтов

У меня есть такой байт[]

byte[] buffer = new byte[1024];

этот byte[] может иметь такие значения:

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.

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

@GiladGreen - только тогда, когда также гарантированы тройные нули.

Henk Holterman 20.02.2019 18:59

Мы предполагаем, что это 4-байтовые целые числа, старшие байты идут первыми?

Joe Sewell 20.02.2019 19:02

.net имеет BinaryReaderdocs.microsoft.com/en-us/dotnet/api/…

Daniel A. White 20.02.2019 19:04

@DanielA.White - я ожидаю того же порядка следования байтов, что и BitConverter.

Henk Holterman 20.02.2019 19:06

@DanielA.White, BinaryReader читает целые числа в формате с прямым порядком байтов. OP специально упоминает, что целые октеты/байты находятся в порядке Hi-Lo (порядок с обратным порядком байтов)

user2819245 20.02.2019 19:17

@elgonzo я связал это в своем ответе. stackoverflow.com/questions/8620885/…

Daniel A. White 20.02.2019 19:18

Да, только сейчас увидел твой ответ. Прошу прощения за лишний комментарий :-D

user2819245 20.02.2019 19:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
866
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

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

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;
}

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

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

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

Это возможно благодаря следующему:

I can safely assume that [...] they take form of 4 bytes with 1st 3 being 0's

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

@ user6f6e65 да, что я пропустил?

Callum Watkins 20.02.2019 19:15

Он хочет, чтобы первые 4 байта были объединены в 32-битное целое число. Нет приведение байтов

user6f6e65 20.02.2019 19:16

@ user6f6e65 Поскольку первые три байта всегда будут равны нулю, от каждого целого числа требуется только последний байт.

Callum Watkins 20.02.2019 19:17

это было иронично, поскольку я не прочитал вопрос полностью. лмао. ты получишь мой голос

user6f6e65 20.02.2019 19:18

@ user6f6e65 не беспокойтесь, ха-ха

Callum Watkins 20.02.2019 19:19

«с 1-м 3 равным 0» было добавлено позже.

Henk Holterman 21.02.2019 07:30
Ответ принят как подходящий

Простая функция «сделай сам»:

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);

Другие вопросы по теме