Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Шестнадцатиричный код символа и байт

249
22 мая 2007 года
DissDoc
639 / / 01.10.2004
1. Как получить шестнадцатиричный код символа и перевести этот код в строку. Т.е. есть у меня символ 'd' -> получили шестнадцатиричный код например 6F -> перевели в строку char *str = "6F"
2. Как побайтно читать из файла и получать шестнадцатиричное значение каждого байта? (такое возможно)

ЗЫ поиском пользовался. Не нашел (может просто не умею пользоваться) Помогите, очень надо )
Использую язык С/C++
15K
23 мая 2007 года
vja
85 / / 09.01.2007
^_^ ну вы даете :)

1. если у вас есть символ, к примеру 'd', то это только для вас он так выглядит, на самом деле это (поверю, проверять не буду) 0x6f, все дело как это воспринимать...
к примеру, если переменная типа char равна 'd', то юзая тот же cout увидим именно символ 'd', а если его преобразовать к (unsigned short)((unsigned char)('d')) то увидим реальное значение - 0x6f... думаю более - менее разъяснил...
а чтобы перевести в строку - существуют же функции atoi и itoa... здесь нужна itoa - параметры и прочее - в гугле...
можно конечно и ручками сделать - все тогда на места встанет...

2. если юзать апи винды - то все просто, берем файл и читаем с него в буфер нужное нам количесвто байт (ф-ей ReadFile)... там будет уже "шестнадцатиричное значение каждого байта", а чтобы получить из них строку - см. 1
можно конечно и fread всякими, но там нужно включит режим бинарного чтения, а я не помню как это и где... ^)

ps все же проверил, 'd' = 0x64 :)
20K
23 мая 2007 года
sja
22 / / 08.01.2007
Цитата: DissDoc
1. Как получить шестнадцатиричный код символа и перевести этот код в строку. Т.е. есть у меня символ 'd' -> получили шестнадцатиричный код например 6F -> перевели в строку char *str = "6F"



Во-первых, код символа d - это 64.
Использование функции itoa:

 
Код:
char *siska = new char[100];
    memset(siska, 0, 100); //очистили созданную строку
    unsigned int a = 'd';       // пусть твой символ Д
    itoa(a, siska, 16); // 16 - значит в шестнадцатеричную
    cout << siska << endl; // вот и 64 получилось в 16ричной


Цитата: DissDoc

2. Как побайтно читать из файла и получать шестнадцатиричное значение каждого байта? (такое возможно)


Когда читаешь файл побайтно, тогда ты и думашь как тебе этот байт рассматривать - надо как текст, просто печатаешь, надо как 16ричное число в виде строки - снова вызыва ИТОА.

Чтение файлов под виндой делается следующим образом:

Код:
HANDLE hFile;
hFile = CreateFile("FILENAME.EXT",  
            GENERIC_READ | GENERIC_WRITE,  
            FILE_SHARE_READ,  
            NULL,  
            OPEN_ALWAYS,            
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    lpszReader = new char[10];
    DWORD dwShared=0;
// читаем 1 байт из файла
           ReadFile(hFile, lpszReader, 1, &dwShared, NULL);

в переменной dwShared будет колво считанных байт в lpszReader.

читай WIN SDK там все это есть.
3
23 мая 2007 года
Green
4.8K / / 20.01.2000
Граждане, ну если вы пишете на C++, то почему бы не использовать C++ ?
Если вы используете такой мощный инструмент как потоки, то зачем вам нужны такие древние C-style методы как itoa ?
При чем тут Win SDK, если человек говорит о языке C++, а не о платформе Windows?

А теперь сравни то, что ты наворотил, с тем как аккуратно это выглядит на C++:
 
Код:
ifstream file(filename);
    while( !file.eof() ) {
        char ch;
        file >> ch;
        cout << hex << (int)ch << ' ';
    }
3
23 мая 2007 года
Green
4.8K / / 20.01.2000
Немного комментариев к твоему коду

Цитата: sja

 
Код:
char *siska = new char[100];
    memset(siska, 0, 100); //очистили созданную строку
    unsigned int a = 'd';       // пусть твой символ Д
    itoa(a, siska, 16); // 16 - значит в шестнадцатеричную
    cout << siska << endl; // вот и 64 получилось в 16ричной


1. Почему ты выделяешь массив под 100 элементов? Достаточно всего 2х.
2. Зачем ты выделяешь его динамически? Где в таком случае освобождение памяти?

Цитата: sja

Код:
HANDLE hFile;
hFile = CreateFile("FILENAME.EXT",  
            GENERIC_READ | GENERIC_WRITE,  
            FILE_SHARE_READ,  
            NULL,  
            OPEN_ALWAYS,            
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    lpszReader = new char[10];
    DWORD dwShared=0;
// читаем 1 байт из файла
           ReadFile(hFile, lpszReader, 1, &dwShared, NULL);


3. Зачем ты открываешь файл для чтения-записи, если собираешься только читать?
4. Почему ты выделяешь память под 10 элементов, хотя читать будешь только 1 ?
5. Зачем выделять динамически? Почему бы сразу не читать в переменную типа char?
6. Третим аргументом вызова ReadFile ты используешь magic number 1. Правильнее будет явно показать откуда берется размер, т.е. написать sizeof(char).

15K
24 мая 2007 года
vja
85 / / 09.01.2007
2Green
суть в том, чтобы человек понял, как это работает, а какой интстументарий применять - это дело уже сугубо личное и зависит еще и от задача в принципе...

и по поводу комментариев к коду sja - что то не увидел ни одного серъезного комментария... человек выложил работоспособные куски кода (именно куски, а не весь листинг) дабы человек на живом примере лучше понял...
я так понимаю что ты мастер stl (я курю пока что в сторонке ^) и твой пример тоже добро
92
24 мая 2007 года
Тень Пса
2.2K / / 19.10.2006
лично я ЗА то, чтобы народ отличал С и С++, хоть и сам порой грешу, но очень стараюсь от этого избавиться :rolleyes:

Green, +1

PS:
хотя, даже автор сказал, что пользует C/C++ ;)
15K
24 мая 2007 года
vja
85 / / 09.01.2007
а объявление переменных где попало - чем не с++ ;)
3
24 мая 2007 года
Green
4.8K / / 20.01.2000
Цитата: vja
а объявление переменных где попало - чем не с++ ;)


В С++ надо объявлять не "где попало", а непосредственно перед использованием.

Цитата: vja
2Green
суть в том, чтобы человек понял, как это работает, а какой интстументарий применять - это дело уже сугубо личное и зависит еще и от задача в принципе...


Мой код не способствует пониманию?

Цитата: vja

и по поводу комментариев к коду sja - что то не увидел ни одного серъезного комментария... человек выложил работоспособные куски кода (именно куски, а не весь листинг) дабы человек на живом примере лучше понял...


Если человек выкладывает ПРИМЕР, то это должен быть код близкий к образцовому.
Если ты не увидел ни одного серьезного комментария, то это не говорит о несерьезности комментариев, а лишь о твоем восприятии действительности.

Моё мнение, что:
1) magic number - это зло (это относится к комментариям 1, 4, 6);
2) memory leak - это зло (это относится к комментариям 2, 5);
3) небольшие временные блоки памяти лучше выделять на стеке, чем в куче. Это связано с минимизацией ошибок типа memory leak, с минимизацией фрагментации памяти и пр. (это относится к комментариям 2, 5);
4) при работе с системными объектами (в случае примере файл) необходимо четко устанавливать режим работы с ними (это относится к комментарию 3). Это так же помогает избежать некоторых проблем и трудностей.

Цитата: vja

я так понимаю что ты мастер stl (я курю пока что в сторонке ^) и твой пример тоже добро


Я ещё и на машинке вышивать умею... :)

20K
24 мая 2007 года
sja
22 / / 08.01.2007
если кто не согласен с моим кодом, укажите в моем коде строку с ошибкой или подправьте до мегарешения - буду рад!

p.s.: ничего страшного с "кучей" не случится.
3
24 мая 2007 года
Green
4.8K / / 20.01.2000
Цитата: sja
если кто не согласен с моим кодом, укажите в моем коде строку с ошибкой или подправьте до мегарешения - буду рад!


Я не согласен. Ошибки указал. Что-то радости твоей не заметил. :)
Рабочий код - ещё не значит корректный.

Цитата: sja
p.s.: ничего страшного с "кучей" не случится.


Я же ясно сказал, что случится - фрагментация.

Код может казаться неплохим, если ты не обладаешь достаточным опытом.
Как только на собственном опыте насобираешь шишек и банок, подобный код начинает резать глаз. И STL тут не при чем.
Если я вижу проблемы в коде, а ты нет, то почему бы мне не рассказать о проблемах, а тебе не прислушаться?

255
25 мая 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Green
Я ещё и на машинке вышивать умею... :)



+1 :D :D :D

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог