У меня есть такой байт[]
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.
Как мне это сделать на С#?
Мы предполагаем, что это 4-байтовые целые числа, старшие байты идут первыми?
.net имеет BinaryReaderdocs.microsoft.com/en-us/dotnet/api/…
@DanielA.White - я ожидаю того же порядка следования байтов, что и BitConverter.
@DanielA.White, BinaryReader читает целые числа в формате с прямым порядком байтов. OP специально упоминает, что целые октеты/байты находятся в порядке Hi-Lo (порядок с обратным порядком байтов)
@elgonzo я связал это в своем ответе. stackoverflow.com/questions/8620885/…
Да, только сейчас увидел твой ответ. Прошу прощения за лишний комментарий :-D





Используйте класс преобразования.
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 да, что я пропустил?
Он хочет, чтобы первые 4 байта были объединены в 32-битное целое число. Нет приведение байтов
@ user6f6e65 Поскольку первые три байта всегда будут равны нулю, от каждого целого числа требуется только последний байт.
это было иронично, поскольку я не прочитал вопрос полностью. лмао. ты получишь мой голос
@ user6f6e65 не беспокойтесь, ха-ха
«с 1-м 3 равным 0» было добавлено позже.
Простая функция «сделай сам»:
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);
@GiladGreen - только тогда, когда также гарантированы тройные нули.