Шестнадцатиричный код символа и байт
2. Как побайтно читать из файла и получать шестнадцатиричное значение каждого байта? (такое возможно)
ЗЫ поиском пользовался. Не нашел (может просто не умею пользоваться) Помогите, очень надо )
Использую язык С/C++
1. если у вас есть символ, к примеру 'd', то это только для вас он так выглядит, на самом деле это (поверю, проверять не буду) 0x6f, все дело как это воспринимать...
к примеру, если переменная типа char равна 'd', то юзая тот же cout увидим именно символ 'd', а если его преобразовать к (unsigned short)((unsigned char)('d')) то увидим реальное значение - 0x6f... думаю более - менее разъяснил...
а чтобы перевести в строку - существуют же функции atoi и itoa... здесь нужна itoa - параметры и прочее - в гугле...
можно конечно и ручками сделать - все тогда на места встанет...
2. если юзать апи винды - то все просто, берем файл и читаем с него в буфер нужное нам количесвто байт (ф-ей ReadFile)... там будет уже "шестнадцатиричное значение каждого байта", а чтобы получить из них строку - см. 1
можно конечно и fread всякими, но там нужно включит режим бинарного чтения, а я не помню как это и где... ^)
ps все же проверил, 'd' = 0x64 :)
Во-первых, код символа d - это 64.
Использование функции itoa:
memset(siska, 0, 100); //очистили созданную строку
unsigned int a = 'd'; // пусть твой символ Д
itoa(a, siska, 16); // 16 - значит в шестнадцатеричную
cout << siska << endl; // вот и 64 получилось в 16ричной
2. Как побайтно читать из файла и получать шестнадцатиричное значение каждого байта? (такое возможно)
Когда читаешь файл побайтно, тогда ты и думашь как тебе этот байт рассматривать - надо как текст, просто печатаешь, надо как 16ричное число в виде строки - снова вызыва ИТОА.
Чтение файлов под виндой делается следующим образом:
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 там все это есть.
Если вы используете такой мощный инструмент как потоки, то зачем вам нужны такие древние C-style методы как itoa ?
При чем тут Win SDK, если человек говорит о языке C++, а не о платформе Windows?
А теперь сравни то, что ты наворотил, с тем как аккуратно это выглядит на C++:
while( !file.eof() ) {
char ch;
file >> ch;
cout << hex << (int)ch << ' ';
}
memset(siska, 0, 100); //очистили созданную строку
unsigned int a = 'd'; // пусть твой символ Д
itoa(a, siska, 16); // 16 - значит в шестнадцатеричную
cout << siska << endl; // вот и 64 получилось в 16ричной
1. Почему ты выделяешь массив под 100 элементов? Достаточно всего 2х.
2. Зачем ты выделяешь его динамически? Где в таком случае освобождение памяти?
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).
суть в том, чтобы человек понял, как это работает, а какой интстументарий применять - это дело уже сугубо личное и зависит еще и от задача в принципе...
и по поводу комментариев к коду sja - что то не увидел ни одного серъезного комментария... человек выложил работоспособные куски кода (именно куски, а не весь листинг) дабы человек на живом примере лучше понял...
я так понимаю что ты мастер stl (я курю пока что в сторонке ^) и твой пример тоже добро
В С++ надо объявлять не "где попало", а непосредственно перед использованием.
суть в том, чтобы человек понял, как это работает, а какой интстументарий применять - это дело уже сугубо личное и зависит еще и от задача в принципе...
Мой код не способствует пониманию?
и по поводу комментариев к коду sja - что то не увидел ни одного серъезного комментария... человек выложил работоспособные куски кода (именно куски, а не весь листинг) дабы человек на живом примере лучше понял...
Если человек выкладывает ПРИМЕР, то это должен быть код близкий к образцовому.
Если ты не увидел ни одного серьезного комментария, то это не говорит о несерьезности комментариев, а лишь о твоем восприятии действительности.
Моё мнение, что:
1) magic number - это зло (это относится к комментариям 1, 4, 6);
2) memory leak - это зло (это относится к комментариям 2, 5);
3) небольшие временные блоки памяти лучше выделять на стеке, чем в куче. Это связано с минимизацией ошибок типа memory leak, с минимизацией фрагментации памяти и пр. (это относится к комментариям 2, 5);
4) при работе с системными объектами (в случае примере файл) необходимо четко устанавливать режим работы с ними (это относится к комментарию 3). Это так же помогает избежать некоторых проблем и трудностей.
я так понимаю что ты мастер stl (я курю пока что в сторонке ^) и твой пример тоже добро
Я ещё и на машинке вышивать умею... :)
p.s.: ничего страшного с "кучей" не случится.
Я не согласен. Ошибки указал. Что-то радости твоей не заметил. :)
Рабочий код - ещё не значит корректный.
Я же ясно сказал, что случится - фрагментация.
Код может казаться неплохим, если ты не обладаешь достаточным опытом.
Как только на собственном опыте насобираешь шишек и банок, подобный код начинает резать глаз. И STL тут не при чем.
Если я вижу проблемы в коде, а ты нет, то почему бы мне не рассказать о проблемах, а тебе не прислушаться?
+1 :D :D :D