2011-02-07 3 views
3

Мне нужно преобразовать значение Int32 в 3-байтовое (24-разрядное) целое число. Endianness остается тем же (немного), но я не могу понять, как правильно перемещать знак. Значения уже привязаны к правильному диапазону, я просто не могу понять, как преобразовать 4 байта в 3. Используя C# 4.0. Это для аппаратной интеграции, поэтому я должен иметь 24-битные значения, не могу использовать 32 бит.Преобразование Int32 в 24-разрядное целое число со знаком

+0

Какого типа вы планируете хранить 24-разрядное целое число в? –

+0

Байт-массив будет в порядке. Я буду выводить 3 байта через последовательное соединение, поэтому, пока я могу получить его в байтах, я должен идти. – drharris

+0

Эта третья строка ничего не сделает ('i & 0xffffff' всегда положительна). Кроме того, вы можете захотеть следовать второй части ответа Джо, который работает на системах с разными континентностями; код, который у вас есть, будет работать пока, но будет необычным, если вы попытаетесь запустить его на PowerPC или MIPS, например. –

ответ

1

Если вы хотите сделать это преобразование, просто удалите верхний байт четырехбайтового номера. Представление двух дополнений правильно позаботится о знаке. Если вы хотите сохранить 24-битное число в переменной Int32, вы можете использовать v & 0xFFFFFF, чтобы получить только нижние 24 бита. Я видел ваш комментарий о байтовом массиве: если у вас есть место в массиве, напишите все четыре байта числа и просто отправьте первые три; тем не менее, это специфично для малоинтенсивных систем.

+0

Спасибо за информацию. Я все еще не уверен в знаке, поскольку он обычно находится в самом значительном бит. Например, попробуйте код 'Console.Write (-42 & 0xffffff);'. Или я чего-то не хватает? – drharris

+0

Он будет хранить только самые младшие три байта, которые являются неподписанными (поскольку вы правы относительно бита знака, находящегося в верхнем байте). Однако даже с маской '42' и' -42' будут производить разные результаты после операции И. –

+0

Итак, я могу выполнить 'int bit24 = bit32 & 0xffffff;', а затем выполнить бит2 | = 0x800000; 'если он проверяет на отрицательный? В основном сброс бита знака вручную? – drharris

2

Нашел: http://bytes.com/topic/c-sharp/answers/238589-int-byte

int myInt = 800; 
byte[] myByteArray = System.BitConverter.GetBytes(myInt); 

звучит как вам просто нужно, чтобы получить 3 последних элементов массива.

EDIT:

, как Иеремия отметила, вам нужно сделать что-то вроде

int myInt = 800; 
byte[] myByteArray = System.BitConverter.GetBytes(myInt); 

if (BitConverter.IsLittleEndian) { 
    // get the first 3 elements 
} else { 
    // get the last 3 elements 
} 
+0

Обратите внимание, что в документации указано, что результат «GetBytes» находится в исходной сущности системы, поэтому должен быть тест на переносимость. Я думаю, что вы имели в виду «первые 3 элемента», а не «последние 3» для little-endian. –

+0

Хороший вопрос, но не все ли 3 ответа имеют один и тот же недостаток? или работает v & 0xFFFFFF, потому что логика обрабатывается на более низком уровне? – Joe

+1

Какой недостаток? Требуется система с маленькими концами? Все решения, которые пишут в байтовый массив, похоже, требуют проверки подлинности; 'v & 0xFFFFFF' выполняется в 32-битном слове без необходимости знать, как это представлено в виде байтов. –

Смежные вопросы