#c# #bytearray #int #byte
#c# #массивы #int #байт
Вопрос:
Я пытаюсь преобразовать 3 байта в целое число со знаком (с большой запятой) в C #.
Я пытался использовать BitConverter.ToInt32
метод, но моя проблема в том, какое значение должно иметь байт lats.
Кто-нибудь может подсказать мне, как я могу сделать это по-другому?
Мне также нужно преобразовать 5 (или 6 или 7) байт в длину со знаком, есть ли какое-либо общее правило, как это сделать?
Заранее спасибо за любую помощь.
Комментарии:
1. Знак и величина? Два дополняют друг друга?
2. Это дополнение two
Ответ №1:
В качестве последнего средства вы всегда можете shift add самостоятельно:
byte b1, b2, b3;
int r = b1 << 16 | b2 << 8 | b3;
Просто меняйте местами b1 / b2 / b3, пока не получите желаемый результат.
Если подумать, это никогда не приведет к отрицательным значениям.
Какой результат вы хотите, когда msb > = 0x80?
Часть 2, расширение знака методом перебора:
private static int Bytes2Int(byte b1, byte b2, byte b3)
{
int r = 0;
byte b0 = 0xff;
if ((b1 amp; 0x80) != 0) r |= b0 << 24;
r |= b1 << 16;
r |= b2 << 8;
r |= b3;
return r;
}
Я тестировал это с:
byte[] bytes = BitConverter.GetBytes(p);
int r = Bytes2Int(bytes[2], bytes[1], bytes[0]);
Console.WriteLine("{0} == {1}", p, r);
для нескольких p
.
Комментарии:
1. хорошо, спасибо за помощь. Мое окончательное решение немного отличается, но я также использую механизм проверки наиболее значимого бита (b1 amp; 0x80), чтобы определить, является ли число положительным или отрицательным.
2. @vc.one, да, спасибо за правку.
Также необходимо
()
:(b1 << 16) ...
Ответ №2:
Последнее значение должно быть 0, если оно не установлено для положительного числа, 256 для отрицательного.
Чтобы узнать, что вы должны передать, вы можете попробовать преобразовать это другим способом:
var bytes = BitConverter.GetBytes(i);
int x = BitConverter.ToInt32(bytes, 0);
Ответ №3:
Чтобы добавить к существующим ответам здесь, есть небольшая ошибка, которая Bitconverter.ToInt32()
выдаст ArgumentException
, если размер массива меньше sizseof(int)
(4) байт;
Целевой массив недостаточно длинный, чтобы скопировать все элементы в коллекции. Проверьте индекс и длину массива.
Учитывая размер массива меньше sizeof(int)
(4) байт, вы можете компенсировать заполнение влево / вправо следующим образом;
Правая панель
В результате получаются положительные Int32
числа
int intByteSize = sizeof(int);
byte[] padded = new byte[intByteSize];
Array.Copy(sourceBytes, 0, padded, 0, sourceBytes.Length);
sourceBytes = padded;
Левая панель
В результате получаются отрицательные Int32
числа, предполагающие ненулевое значение в байтовом индексе sourceBytes.Length - 1
.
int intByteSize = sizeof(int);
byte[] padded = new byte[intByteSize];
Array.Copy(sourceBytes, 0, padded, intByteSize - sourceBytes.Length, sourceBytes.Length);
sourceBytes = padded;
После заполнения вы можете безопасно вызывать int myValue = BitConverter.ToInt32(sourceBytes, 0);
.