![]() |
|
Модераторы: bsa |
![]()
|
|
| cupper |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
О ужас, нету на форуме темы где было бы нормально написано это, куча тем с похожим вопросом и немеренная куча вариантов как якобы это делаеться, но в итоге нече неработает.
Нужно считать бинарный файл, вот его спецификация 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, в точности наоборот. Эта даже понятно почему так, но как сделать чтобы читалось в том виде в каком надо Это сообщение отредактировал(а) cupper - 24.3.2009, 20:24 |
||||||
|
|||||||
| Friackazoid |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 23.2.2006 Репутация: нет Всего: 3 |
ГОСПОДИ...
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
после небольшое шлефошки на техже данных выдает
magic = 2293672 number = 2088810083 0 0 8 1 0 0 39 16 7 2 что я хз как обяснить, пока. Вопрос в силе. ------ 1) пока этот код вообще нече нечитает, а значения случайный мусор 2) ... ------ необязательно только на С++, С тоже уместно теперь. Любыми фукнциями, лижбы балы решена поставленная задача... я в отчаяние (( Это сообщение отредактировал(а) cupper - 24.3.2009, 23:17 |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
какая у вас платформа? Подозреваю что littleendian. Используйте сетевые функции для переворачивания байтов в обратный порядок.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
ну к примеру считал я первые два значения int , дальше идут unsigned byte, тобишь char, считываю их в миссив чар, при выводу конвертируя их в int получаю значения в диапазоне от -127 до 128. Мне же нужно чтобы было от 0 до 255, исли конвертировать в unsigned то вместо отрицательных выводяться очень большие числа. Я конечно могу проста при конфертировании в int прибовлять к полученному значению 127 тем самым получив нужный диапазон, НО это УЖАС !!!
как еще можно ? Значения это диапазон цветов от 0 (белый) до 255 (чертный) а функции ntohs и т.д. в какои библиотеке ? в мсдн написано что Winsock2.h, но это ж сугубо виндовская, а какже для линукса ? |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
|
||||
|
|||||
| cupper |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
эм что за платформа ? непонял. На функцию компилятор выдает непонятную ошибку, [Linker error] undefined reference to `ntohl@4' при передачи в качестве параметра переменной insigned int |
||||
|
|||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
прямтаки неудобно получилось, я вчера бошка опухла видно совсем, вот как была решена эта задача седня за пару минут 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 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
см. http://msdn.microsoft.com/en-us/library/ms740069(VS.85).aspx Добавлено через 59 секунд если, конечно, вам вообще нужно что-то переворачивть 8)) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||
|
|||||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
а не в вижаке как добовлять ?) если в Dev-C++ компилю то #pragma comment(lib,"Ws2_32.lib") както особо нече неменяет :(
блин скокож гемороя в это затеи Это сообщение отредактировал(а) cupper - 26.3.2009, 11:40 |
|||
|
||||
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
не могу прочитать из бинарного файла, заголовок нормально читает, а потом где уже данные идут всё нули выдает.
|
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
На будущее: "MSB first" происходит от "most significant byte first", что в переводе значит - старший байт идет первым. Процессоры Intel/AMD имеют платформу little endian, где старший байт идет в конце. Поэтому числа надо "переворачивать".
Но я бы просто сделал так:
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну int я и так переворачивал, а char это ведь и есть byte чего его переворачивать?
п.с.
тут пропущено long? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
mrgloom, ничего тут не пропущено. Конечно, если ты пишешь программу под процессор, разрядность которого ниже 32-х битов, то да, long необходим.
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
а что просто unsigned это тип данных? или я как то функцию не понял.
и еще возможно что под unsigned byte они имели ввиду что то отличное от unsigned char? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |