Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как преобразовать Byte[] в Int32?

#c_sharp


Есть Byte[] buffer большого размера, в который читается значение типа Int32 (из tcp).
Как из этого Byte[] (или его фрагмента) получить Int32?

Можно брать 4 элемента массива и складывать, предварительно сдвинув биты, или есть
какое-то встроенное средство C# для этого?

Может глупый вопрос, но все-таки...    


Ответы

Ответ 1



Для конвертации базовых типов в массивы байт и обратно есть класс BitConverter. using System; public class Example { public static void Main() { // Create an Integer from a 4-byte array. Byte[] bytes1 = { 0xEC, 0x00, 0x00, 0x00 }; Console.WriteLine("{0}--> 0x{1:X4} ({1:N0})", FormatBytes(bytes1), BitConverter.ToInt32(bytes1, 0)); // Create an Integer from the upper four bytes of a byte array. Byte[] bytes2 = BitConverter.GetBytes(Int64.MaxValue / 2); Console.WriteLine("{0}--> 0x{1:X4} ({1:N0})", FormatBytes(bytes2), BitConverter.ToInt32(bytes2, 4)); // Round-trip an integer value. int original = (int) Math.Pow(16, 3); Byte[] bytes3 = BitConverter.GetBytes(original); int restored = BitConverter.ToInt32(bytes3, 0); Console.WriteLine("0x{0:X4} ({0:N0}) --> {1} --> 0x{2:X4} ({2:N0})", original, FormatBytes(bytes3), restored); } private static string FormatBytes(Byte[] bytes) { string value = ""; foreach (var byt in bytes) value += String.Format("{0:X2} ", byt); return value; } } // The example displays the following output: // EC 00 00 00 --> 0x00EC (236) // FF FF FF FF FF FF FF 3F --> 0x3FFFFFFF (1,073,741,823) // 0x1000 (4,096) --> 00 10 00 00 --> 0x1000 (4,096) UPD. И не забывайте про порядок байтов. В случае с TCP/IP, вероятно, придется изменить порядок байтов на обратный. Узнать какой порядок используется в текущей системе можно через свойство того же класса BitConverter.IsLittleEndian

Ответ 2



Вопрос и правда глупый...ведь, как вам, надеюсь, известно, byte отличается от int32 лишь количеством занимаемой памяти в ОЗУ. Так, sizeof(Int32)==4, а sizeof(byte)==1, соответсвенно. Для программиста использование типа BYTE может быть обоснованно лишь в том случае, когда в переменной этого типа нет смысла хранить числа>255. В вашем случае преобразование невозможно по одной простой причине - нельзя преобразовать массив в число =) Как мне кажется, сюда: Byte[] buffer записываются значения байтов( либо 1, либо 0 ) в процессе работы с протоколом TCP. Какие данные - зависит от конкретной задачи. В таком случае можно конкатенировать все байты в одну строку и преобразовать из двоичной системы в десятеричную. Это уже дело техники, как говорится =)

Комментариев нет:

Отправить комментарий