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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вытащить из бинарника шестнадцатиричное число 
:(
    Опции темы
Salatovec
Дата 16.11.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго всем времени суток. Есть бинарный файл, в нём хранятся шестнадцатиричные значения.

Считывать я его считываю, но на вывод значения идут не в том виде, в котором хотелось бы.

Вот код:

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    FILE *file;

    file = fopen( "bin_file.dat", "rb");

    int buf;

    fread( &buf, sizeof(buf), 1, file);

    Memo1->Lines->Add( buf);

    fclose(file);
}
//---------------------------------------------------------------------------



Но в мемо вместо 3F10D30B3FE50708 выводится 198381631. В чём моя ошибка? Заранее спасибо!

Это сообщение отредактировал(а) Salatovec - 16.11.2011, 00:06
PM MAIL   Вверх
bsa
Дата 16.11.2011, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Salatovec @  16.11.2011,  01:05 Найти цитируемый пост)
 В чём моя ошибка? 

В том, что по умолчанию любое число преобразуется в строку в десятичной системе. Чтобы этого не происходило, необходимо принудительно указать систему счисления. Для этого подойдет AnsiString::sprintf. Далее, ты ожидаешь увидеть число из 16 шестнадцатеричных цифр, а в int влезает только 8.
Вместо stdio лучше использовать VCL класс TFile (или как его там).

П.С.: Для вопросов по C++ Builder существует отдельный раздел.
PM   Вверх
Salatovec
Дата 16.11.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(bsa @ 16.11.2011,  00:12)

П.С.: Для вопросов по C++ Builder существует отдельный раздел.

Могу ли я продолжать здесь писать в таком случае? Мне не обязательно даже под билдер, я просто в принципе не понимаю всего, что отлично от десятиричной системы...

Цитата(bsa @ 16.11.2011,  00:12)

В том, что по умолчанию любое число преобразуется в строку в десятичной системе. Чтобы этого не происходило, необходимо принудительно указать систему счисления. Для этого подойдет AnsiString::sprintf. Далее, ты ожидаешь увидеть число из 16 шестнадцатеричных цифр, а в int влезает только 8.
Вместо stdio лучше использовать VCL класс TFile (или как его там).

А можно пример, пожалуйста?

Это сообщение отредактировал(а) Salatovec - 16.11.2011, 00:17
PM MAIL   Вверх
bsa
Дата 16.11.2011, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как-то так:
Код
TFileStream *file = new TFileStream("bin_file.dat", fmOpenRead | fmBinary);
unsigned buf;
file->Read(&buf, sizeof(buf));
Memo1->Lines->Add(AnsiString::sprintf("%08X", buf));
delete file;


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


Бывалый
*


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

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



Цитата(bsa @ 16.11.2011,  00:22)
Как-то так:
Код
TFileStream *file = new TFileStream("bin_file.dat", fmOpenRead | fmBinary);
unsigned buf;
file->Read(&buf, sizeof(buf));
Memo1->Lines->Add(AnsiString::sprintf("%08X", buf));
delete file;

Ругается мол [BCC32 Error] Unit1.cpp(22): E2451 Undefined symbol 'fmBinary'
PM MAIL   Вверх
vol4ek
Дата 16.11.2011, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



обычно в бинарные файлы пишут структуры.Не зная структуры читать только побайтово со всеми вытекающими.
PM MAIL ICQ   Вверх
Salatovec
Дата 16.11.2011, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(vol4ek @ 16.11.2011,  00:38)
обычно в бинарные файлы пишут структуры.Не зная структуры читать только побайтово со всеми вытекающими.

smile 

Это сообщение отредактировал(а) Salatovec - 16.11.2011, 01:08
PM MAIL   Вверх
volatile
Дата 16.11.2011, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Salatovec @  16.11.2011,  00:05 Найти цитируемый пост)
Но в мемо вместо 3F10D30B3FE50708 выводится 198381631. В чём моя ошибка? 

Код

    FILE *file;
    file = fopen( "bin_file.dat", "rb");
    unsigned char buf [8];
    fread( buf, sizeof buf, 1, file);
    fclose(file);

    AnsiString s = "";
    for (int i=0; i<sizeof buf; ++i)
       s +=  AnsiString::sprintf("%02X", buf [i]);
       
    Memo1->Lines->Add (s);

д'Билдера у меня нет...

Это сообщение отредактировал(а) volatile - 16.11.2011, 02:31
PM MAIL   Вверх
bsa
Дата 16.11.2011, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Salatovec @  16.11.2011,  01:33 Найти цитируемый пост)
Ругается мол [BCC32 Error] Unit1.cpp(22): E2451 Undefined symbol 'fmBinary' 
Клавишами F1 и Ctrl-F1 пользоваться умеешь? Подведи курсор на TFileStream и нажми Ctrl-F1 - получишь вменяемую справку.
Я билдером не пользовался уже лет 5. Ну не помню я всех тонкостей. А в интернете нормальной доки не нашел.
PM   Вверх
Salatovec
Дата 16.11.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(volatile @ 16.11.2011,  02:09)
Цитата(Salatovec @  16.11.2011,  00:05 Найти цитируемый пост)
Но в мемо вместо 3F10D30B3FE50708 выводится 198381631. В чём моя ошибка? 

Код

    FILE *file;
    file = fopen( "bin_file.dat", "rb");
    unsigned char buf [8];
    fread( buf, sizeof buf, 1, file);
    fclose(file);

    AnsiString s = "";
    for (int i=0; i<sizeof buf; ++i)
       s +=  AnsiString::sprintf("%02X", buf [i]);
       
    Memo1->Lines->Add (s);

д'Билдера у меня нет...

Во, спасибо огромное, помогло! Единственный теперь вопрос - как узнать полное количество битов для считывания? В вашем примере их всего 10, а в моём файле многим-многим больше?

Добавлено через 50 секунд
Цитата(bsa @ 16.11.2011,  10:19)
Цитата(Salatovec @  16.11.2011,  01:33 Найти цитируемый пост)
Ругается мол [BCC32 Error] Unit1.cpp(22): E2451 Undefined symbol 'fmBinary' 
Клавишами F1 и Ctrl-F1 пользоваться умеешь? Подведи курсор на TFileStream и нажми Ctrl-F1 - получишь вменяемую справку.
Я билдером не пользовался уже лет 5. Ну не помню я всех тонкостей. А в интернете нормальной доки не нашел.

К сожалению у меня не установлен SDK, да, бывает и такое...
PM MAIL   Вверх
Salatovec
Дата 17.11.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Salatovec @  16.11.2011,  13:16 Найти цитируемый пост)
Во, спасибо огромное, помогло! Единственный теперь вопрос - как узнать полное количество битов для считывания? В вашем примере их всего 10, а в моём файле многим-многим больше?

Всё ещё остаётся актуальным...


Это сообщение отредактировал(а) Salatovec - 17.11.2011, 22:48
PM MAIL   Вверх
volatile
Дата 17.11.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Salatovec @  17.11.2011,  22:48 Найти цитируемый пост)
количество битов для считывания? В вашем примере их всего 10

Каких битов, и каких 10?  smile 
У меня считывается 8 байтов. Как и было в вашем вопросе.

Если нужно больше, узнаете размер файла, и дейтвуете в соответствии...
Организуйте цикл, и добаляйте хоть весь файл.

PM MAIL   Вверх
Salatovec
Дата 20.11.2011, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(volatile @ 17.11.2011,  23:32)
Цитата(Salatovec @  17.11.2011,  22:48 Найти цитируемый пост)
количество битов для считывания? В вашем примере их всего 10

Каких битов, и каких 10?  smile 
У меня считывается 8 байтов. Как и было в вашем вопросе.

Если нужно больше, узнаете размер файла, и дейтвуете в соответствии...
Организуйте цикл, и добаляйте хоть весь файл.

Ой, да, 8 - я опечатался... Так а каким образом пробежаться по всему файлу? Как вы выразились - узнать его размер?
PM MAIL   Вверх
volatile
Дата 20.11.2011, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Salatovec @  20.11.2011,  01:09 Найти цитируемый пост)
Так а каким образом пробежаться по всему файлу? Как вы выразились - узнать его размер? 

В принципе, размер даже и не нужен.
Когда файл закончится функция fread даст знать об этом.  smile 
fread


PM MAIL   Вверх
volatile
Дата 20.11.2011, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Salatovec, вообще рекомендую создать тему в "новичках", с названием:
Цитата(Salatovec @  20.11.2011,  01:09 Найти цитируемый пост)
каким образом пробежаться по всему файлу?

Так как это никакого отношения к первоначальному вопросу не имеет.
Кроме того это явно не тот раздел, чтобы отвечать на такие вопросы.
Да и ответ там вы получите быстрее.





PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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