Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарные файлы, Непонятное поведение 
:(
    Опции темы
wowka19
Дата 14.12.2014, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Код

 FILE * output = fopen("TEST.bin", "wb");

unsigned int Length = 13;
fwrite(&Length, sizeof(unsigned int), 1, output);

fclose(output);


В итоге TEST.bin весит 4 байта, что есть норма так как в моем случае sizeof(unsigned int) == 4.
Открываю файл в HEX-редакторе и вижу: "0d 00", т.е. всего два байта вместо четырех, причем неверно расположенных, ибо 13 == 00 0d.
Я же ожидал увидеть "00 00 00 0d".
Что не так?


Это сообщение отредактировал(а) wowka19 - 14.12.2014, 21:27
PM MAIL   Вверх
vol4ek
Дата 14.12.2014, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: 0
Всего: 0



посмотрел файл в WinHEX - 0D 00 00 00
PM MAIL ICQ   Вверх
wowka19
Дата 14.12.2014, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Но "0D 00 00 00" это не 13, а 218103808. Поэтому должно быть "00 00 00 0D". Вопрос остался.
Получается я как-то неправильно кладу uint, но почему? и как правильно?

Вообще, попрошу посоветовать какую-нибудь статью на эту тему - как правильно упаковывать данные в бинарники.

Это сообщение отредактировал(а) wowka19 - 14.12.2014, 22:13
PM MAIL   Вверх
baldina
Дата 14.12.2014, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(wowka19 @  14.12.2014,  22:09 Найти цитируемый пост)
попрошу посоветовать какую-нибудь статью на эту тему

https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%82%D0%BE%D0%B2
PM MAIL   Вверх
tzirechnoy
Дата 15.12.2014, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Ещё я посоветую прочитать и понять вот это: http://commandcenter.blogspot.ru/2012/04/b...er-fallacy.html
PM MAIL   Вверх
Vasya
Дата 17.12.2014, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Так, к слову, на платформах интел, эсли не ошибаюсь, чтение идет задом на перед, сначала читаются последние байты, потом первые. Т.е. 0D 00 00 00 после прочтения преобразуются  в 00 00 00 DD.

Это сообщение отредактировал(а) Vasya - 17.12.2014, 22:34
PM MAIL   Вверх
feodorv
Дата 18.12.2014, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Vasya @  17.12.2014,  22:26 Найти цитируемый пост)
Т.е. 0D 00 00 00 после прочтения преобразуются  в 00 00 00 DD.

Нет. На "платформах интел" 0D 00 00 00 и есть 0x0000000D безо всяких преобразований (до чтения либо после).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Vasya
Дата 18.12.2014, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Цитата(feodorv @  18.12.2014,  08:43 Найти цитируемый пост)
Цитата(Vasya @  17.12.2014,  22:26 )
Т.е. 0D 00 00 00 после прочтения преобразуются  в 00 00 00 DD.

Нет. На "платформах интел" 0D 00 00 00 и есть 0x0000000D безо всяких преобразований (до чтения либо после). 


ок, я неправильно выразился, ничего не преобразуется, просто при записи сначала записываются младшие байты, затем старшие, поэтому 0d 00 00 00 надо трактовать как 00 00 00 0d.
PM MAIL   Вверх
wowka19
Дата 22.12.2014, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



tzirechnoy, а на русском есть подобная статья?
зы: не ругайте за незнание английского - сам знаю.
PM MAIL   Вверх
sQu1rr
Дата 22.12.2014, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(wowka19 @  22.12.2014,  12:31 Найти цитируемый пост)
а на русском есть подобная статья?

Что-то приблизительно похожее есть тут. http://habrahabr.ru/post/233245/
А так гуглите "Порядок байт"
PM MAIL Skype GTalk   Вверх
feodorv
Дата 22.12.2014, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(wowka19 @  22.12.2014,  14:31 Найти цитируемый пост)
а на русском есть подобная статья?

А чем Вики не угодила? Ссылку дал baldina smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
wowka19
Дата 29.12.2014, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Получил CRC32 в (UNSIGNED LONG). Как мне привести UNSIGNED LONG к 4 CHAR ?

Добавлено через 11 минут и 49 секунд
Ответ:
Код

unsigned long crc32 = Crc32(TYPE_AND_DATA, 17);
char * c = (char*) &crc32; //!!!
char inv[4];
for (int i = 0; i < 4; ++i) inv[i] = c[3-i]; //нужен обратный порядок для представления CRC32 чанка в PNG


Вообще я так и не понял: зачем нужен обратный(прямой) порядок байт. Почему не используют один вариант. Не смогли договориться?
PM MAIL   Вверх
konshyn
Дата 29.12.2014, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(wowka19 @  29.12.2014,  11:47 Найти цитируемый пост)
Вообще я так и не понял: зачем нужен обратный(прямой) порядок байт. Почему не используют один вариант. Не смогли договориться? 

Можно сказать и так
Из Вики:
Цитата

Термины big-endian и little-endian первоначально не имели отношения к информатике. В сатирическом произведении Джонатана Свифта «Путешествия Гулливера» описываются вымышленные государства Лилипутия и Блефуску, в течение многих лет ведущие между собой войны из-за разногласия по поводу того, с какого конца следует разбивать варёные яйца. Тех, кто считает, что их нужно разбивать с тупого конца, в произведении называют Big-endians («тупоконечники»). Споры между сторонниками big-endian и little-endian в информатике также часто носят характер т. н. «религиозных войн».[2]



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
sQu1rr
Дата 29.12.2014, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(wowka19 @  29.12.2014,  09:47 Найти цитируемый пост)
Как мне привести UNSIGNED LONG к 4 CHAR ?

А вы уверены что long 4 байта? или вы для своего (непереносимого) пользования?
PM MAIL Skype GTalk   Вверх
konshyn
Дата 29.12.2014, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(sQu1rr @  29.12.2014,  12:15 Найти цитируемый пост)
А вы уверены что long 4 байта? или вы для своего (непереносимого) пользования? 

Если говорить именно о типе unsigned long, то в стандарте С сказано, что значение должно быть минимум [0; 2^32 -1]. 
Не встречал ни одной платформы, где использовалось бы значение больше. А меньше не может быть, т.к. стандарт обязывает.

А вообще, Вы правы: лучше использовать такие типы, как uint8_t, ..., uint32_t, uint64_t


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.