Назад | Начало урока | Вперед
Содержание

Глава 3 стр 27

Из символьного значения - в десятичное

Теперь нами считано в символьный массив определенное количество байт.
По предыдущим главам мы знаем, что в графическом файле первые 54 байта
занимает так называемый префикс файла, содержащий информацию о размере файла,
размере картинки, числе строк в картинке. Теперь мы можем вытащить из массива
эти данные и вывести их на экран. Тем самым мы имеем возможность проверить правильно
ли скопировались данные из файла в массив.

Пробую вывести на экран первые 54 символа (байта) из массива простым примемом:

int k = 0;

for(int i=0;i<54;i++){

cout<< buf[i];
k++;
if(k==6){
k=0;
cout<< "!" << endl ;
}
}

Результат:

BMв !
6 !
( !
v v !
O ^ !
l!
-d !
-d !
!
n :1954

Как видим на экран вывелось 9 строк "абракадабры".
Но это не совсем абракадабра.

Вот этот массив в Volcov Commander:

42 4D A2 07 00 00 00 00 00 00 36 00 00 00 28 00
00 00 19 00 00 00 19 00 00 00 01 00 18 00 00 00
00 00 6C 07 00 00 C4 0E 00 00 C4 0E 00 00 00 00
00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF

Это должен быть префикс файла.
Это и есть 54 байта префикса bmp-файла. Подтверждением этому является
изображение на стр "Читаем данные из графического файла в массив памяти"
книги А.Волоса "Графические файлы и матрицы". Там на картинке изображен
дамп памяти (массив в который скачано 16 байт из bmp-файла).
Знаки, отображающие содержание массива там и здесь совпадают.
Значит в массив скачано 54 байта из bmp-файла.

Теперь опять вопрос: как средствами С++ преобразовать эти байты
в 16-ричный вид? Опять бы воспользоваться ассемблерной вставкой! Но не получается, же!

По сути дела для конвертации нам надо узнать номер символа. Это и будет
его 16-ричное значение. Это должно быть просто! Это должна быть функция,
в которую помещаем символ и получаем его hex-код.

В принципе данная инструкция и выводит номер символа в десятичном формате,
но верно только тогда, когда старший и младший полубайт не превышают цифру 9.
Естественно - это перенос разряда.

cout<< (int)buf[i];

Значин надо искать преобразование десятичного числа в 16-ричное и все!

%c - одиночный символ
%d - десятичное целое число со знаком
%u - десятичное целое число без знака

Попробуем применить функцию вывода из С - printf(). Эта функция легко преобразует
выводимый аргумент в из символьного в десятчный вид:

printf("\nAs a number, variable c1 is %d", c1);

В нашем контексте это будет выглядеть так:

int k = 0;

for(int i=0;i<54;i++){

//cout<< (int)buf[i];

printf("\nAs a number, variable c1 is %d", buf[i]);

k++;
if(k==6){

k=0;
cout<< "!" << endl ;
}
}

Это интересная получилась программа. Выводит символы в их цифровом десятичном виде!
Это благодаря инструкции из С:

printf("\nAs a number, variable c1 is %d", c1);

Самое время проанализировать, потому, что есть выводы отрицательных чисел!
Эта программа выводит префикс графич файла в десятичных числах, причем
есть отрицательные числа.

Ну, откуда взялись отрицательные числа, это мы уже знаем. Это свойство двоичного
представления данных. Если кто не понял, прочтите главу о хранении данных в переменных
и о переполнении из книги Джонса "Освой самостоятельно С за 21 день" или в любой другой.
Поскольку мы считываем в массив посимвольно, то не может поместить больше 256 байт.
Чтобы не было отрицательных чисел сделаем просто:

for(int i=0;i<54;i++){

temp = (int)buf[i];
if(temp<0) temp = 256+temp;
printf("\nAs a number, variable c1 is %d", temp);

}

То же, что предыдущая, но выводит только положительные значения.
Теперь самое время вывести в переменные размер файла, колич строк и тд.

--------------------------

Итак, чтобы программа работала правильно, нам надо правильно делить размер
картинки в байтах на число строк.

Тестируем программу
Для тестирования возмем графич файл с изображением буквы "А"

Префикс графич файла, в котором изображена буква "А":

424DA2070000
000000003600
000028000000
190000001900
000001001800
000000006C07
0000C40E0000
C40E00000000
000000000000

1. В букве "А" 25 строк и мы соответственно видим в строке 4:

190000001900

16-ричная цифра 19 означает количество строк изображения.
В десятичном выражении это 25 строк, что соответствует действительности!

2. Кроме этого в префиксе указан так же и размер файла в байтах!
Посмотрим внимательно первую строку вторую тетраду в обоих файлах:

424D A207 0000 У буквы "А" строка 1

Здесь величина A207 не что иное как 16-ричное число 07A2, что соответствует
1954 байт. Это же размер графического файла буквы "А" в байтах!

3. Смотрим 6-ю строку, 3-ю тетраду.

В просмотровщике 6C07, фактически 16-ричное число 076C что соответствует 1900.

В итоге из префикса файла мы имеем следующие данные:

size_file 1954 Размер файла в байтах.
size_card 1900 Размер самой картинки в байтах.
chislo_str 25 Количество строк в картинке.
dlina_str 76

/////////////////
Итак нас интересует

2-й 3-й байты: размер графич файла size_file
22-й 23-й байты: количество строк изображения chislo_str
34-й 35-й байты: размер самой картинки в байтах size_card


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz