Python unpack('i') питоновская анпак integer моя реализация - C#
Формулировка задачи:
Предыстория с задачей: Возникла задача разобрать на C# бинарный файл с данными. недолго думая "великий" гуглопоиск выдал ссылку на питоновский файлик разбора подобного файла.
Взяв в руки учебник на python решил накатать самые простые вещи. Ну что бы не ломать голову как это по другому сделать.
В итоге вот что получилось:
в тексте на питоне очень много было таких строк
где s - массив байтов (вообщем содержимое файлика) а p это счетчик от 0 до размера массива s.
unpack распаковывает данные по указанному формату. запись unpack('формат', массив), в данном случае формат = i, i - integer.
не долго думая вот что получилось.
в данном случае pyUnpackToInt(массивбайтизфайла, индекс с короторо начинам читать, сколько читать)
ну и вызов
Хотелось бы услышать ваше мнение. И чуть позже выложу реализацию во float и string если интересно.
Заранее благодарен.
... xblock = unpack('i', s[p : p + 4])[0] ...
public static int pyUnpackToInt(byte[] fileByteArray, int istart, int readbyte) { int Resault = 0; byte[] buff2 = new byte[readbyte]; string tempResault; readbyte = readbyte - 1; tempResault = ""; /// переворачиваем данные в обратном порядке (так как в файле все данные перевернуты for (int j = 0; j <= readbyte / 2; j++) { buff2[readbyte - j] = fileByteArray[istart + j]; } // собираем все в строку как hex и уже строку переводим в десятичное число for (int i = 0; i <= readbyte; i++) { tempResault = tempResault + buff2[i].ToString("X"); } Resault = System.Convert.ToInt32(tempResault, 16); return Resault; }
... int xblock = pyUnpackToInt(fileBytes, p, 4); ...
Решение задачи: «Python unpack('i') питоновская анпак integer моя реализация»
textual
Листинг программы
public static void Main(string[] args) { Console.WriteLine(BigEndianToLittleEndian(new byte[] {12, 09, 00, 00}, 0)); } private static int BigEndianToLittleEndian(byte[] byteArray, int startPos) { int result; result = HexToBin(byteArray[startPos]) << 0; result |= HexToBin(byteArray[startPos + 1]) << 8; result |= HexToBin(byteArray[startPos + 2]) << 16; result |= HexToBin(byteArray[startPos + 3]) << 24; return result; } private static int HexToBin(int hex) { return 16 * (hex / 10) + (hex % 10); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д