| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Считать файл в бинарном виде |
| Автор: cupper 24.3.2009, 20:18 | ||||||
| О ужас, нету на форуме темы где было бы нормально написано это, куча тем с похожим вопросом и немеренная куча вариантов как якобы это делаеться, но в итоге нече неработает. Нужно считать бинарный файл, вот его спецификация TEST SET LABEL FILE (t10k-labels-idx1-ubyte): [offset] [type] [value] [description] 0000 32 bit integer 0x00000801(2049) magic number (MSB first) 0004 32 bit integer 10000 number of items 0008 unsigned byte ?? label 0009 unsigned byte ?? label ........ xxxx unsigned byte ?? label The labels values are 0 to 9. http://yann.lecun.com/exdb/mnist/index.html - первоисточник вот как я пытался делать, точнее последний вариант который хоть чтото делал
выводит следующее
Вот началные биты 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x27, 0x10, это какраз числа 2049 и 10000. что несоотвествует спецификации. Помогите плиз. Язык С++, некаких С-функций, использем fstream. Добавлено через 9 минут и 3 секунды вот дерьмо, 17301504 этож как раз если в битах 01 08 00 00, в точности наоборот. Эта даже понятно почему так, но как сделать чтобы читалось в том виде в каком надо |
| Автор: Friackazoid 24.3.2009, 22:11 | ||
ГОСПОДИ...
|
| Автор: cupper 24.3.2009, 22:32 |
| после небольшое шлефошки на техже данных выдает magic = 2293672 number = 2088810083 0 0 8 1 0 0 39 16 7 2 что я хз как обяснить, пока. Вопрос в силе. ------ 1) пока этот код вообще нече нечитает, а значения случайный мусор 2) ... ------ необязательно только на С++, С тоже уместно теперь. Любыми фукнциями, лижбы балы решена поставленная задача... я в отчаяние (( |
| Автор: jonie 25.3.2009, 07:57 | ||
какая у вас платформа? Подозреваю что littleendian. Используйте сетевые функции для переворачивания байтов в обратный порядок.
|
| Автор: cupper 25.3.2009, 11:22 |
| ну к примеру считал я первые два значения int , дальше идут unsigned byte, тобишь char, считываю их в миссив чар, при выводу конвертируя их в int получаю значения в диапазоне от -127 до 128. Мне же нужно чтобы было от 0 до 255, исли конвертировать в unsigned то вместо отрицательных выводяться очень большие числа. Я конечно могу проста при конфертировании в int прибовлять к полученному значению 127 тем самым получив нужный диапазон, НО это УЖАС !!! как еще можно ? Значения это диапазон цветов от 0 (белый) до 255 (чертный) а функции ntohs и т.д. в какои библиотеке ? в мсдн написано что Winsock2.h, но это ж сугубо виндовская, а какже для линукса ? |
| Автор: cupper 25.3.2009, 20:47 | ||||
эм что за платформа ? непонял. На функцию компилятор выдает непонятную ошибку, [Linker error] undefined reference to `ntohl@4' при передачи в качестве параметра переменной insigned int |
| Автор: cupper 25.3.2009, 21:17 | ||||||
прямтаки неудобно получилось, я вчера бошка опухла видно совсем, вот как была решена эта задача седня за пару минут unsigned char array[28*28*100]; file.read((char*)array,28*28*100); for (int i =0; i<28*28; i++) cout<<(int)array[i]<<endl; выводит как раз то что надо, значения в диапазоне от 0 до 255, но все равно спасибо за помощь |
| Автор: jonie 26.3.2009, 01:17 | ||||||
см. http://msdn.microsoft.com/en-us/library/ms740069(VS.85).aspx Добавлено через 59 секунд если, конечно, вам вообще нужно что-то переворачивть 8)) |
| Автор: cupper 26.3.2009, 11:19 |
| а не в вижаке как добовлять ?) если в Dev-C++ компилю то #pragma comment(lib,"Ws2_32.lib") както особо нече неменяет :( блин скокож гемороя в это затеи |
| Автор: mrgloom 27.4.2012, 09:51 | ||||
не могу прочитать из бинарного файла, заголовок нормально читает, а потом где уже данные идут всё нули выдает.
|
| Автор: bsa 27.4.2012, 15:29 | ||
| На будущее: "MSB first" происходит от "most significant byte first", что в переводе значит - старший байт идет первым. Процессоры Intel/AMD имеют платформу little endian, где старший байт идет в конце. Поэтому числа надо "переворачивать". Но я бы просто сделал так:
|
| Автор: mrgloom 27.4.2012, 17:21 | ||
| ну int я и так переворачивал, а char это ведь и есть byte чего его переворачивать? п.с.
тут пропущено long? |
| Автор: bsa 27.4.2012, 22:53 |
| mrgloom, ничего тут не пропущено. Конечно, если ты пишешь программу под процессор, разрядность которого ниже 32-х битов, то да, long необходим. |
| Автор: mrgloom 28.4.2012, 09:09 |
| а что просто unsigned это тип данных? или я как то функцию не понял. и еще возможно что под unsigned byte они имели ввиду что то отличное от unsigned char? |
| Автор: bsa 1.5.2012, 10:35 | ||
конечно. Это синоним unsigned int.
нет типа byte. Для его создания используется unsigned char. |
| Автор: EgoBrain 1.5.2012, 12:00 |
| Можно втиснутся в тему? У меня похожая проблема: работаю с байтами и получаю не то что нужно. Читаю с реестра REG_DWORD через RegQueryValueEx(). Все данные записываю BYTE[] или в unsigned char[] (что поидее одно и тоже). Если пишу в DWORD, то все в порядке. Как я понял, разница в том, что DWORD содержит прочтенные данные целиком как есть, которые представляют нужное мне число, а BYTE[] естественно разбило 32 бита на 4 байта и хранит кусками. Вот тут-то и не ясно: 1). как данные хранятся 2). как мне их отобразить. |
| Автор: bsa 1.5.2012, 18:02 | ||
EgoBrain, для little endian:
|
| Автор: mrgloom 2.5.2012, 10:14 |
| проблема решилась сама собой там в начале просто были нули) |