Вопрос номер два:
Потом мне то, что содержится в str[] нужно загонять в тип unsigned int (т.е. в переменные этого типа). Вот как я делаю:
...
Я пробовал B=*(str_int+1);
Тогда вот что получается
dkkaa222h111h444c1122fffc111222333---1634429796---616b6b64
---616b6b00---616b6b00
616b6b00---32323261
Как видно в В опять содержится что-то другое.
Ты не сказал, какие значения ты ожидал увидеть?
1. Давай посмотрим на твой считанный буфер в шестнадцатеричном виде:
64 6b 6b 61 61 32 32 32 68 31 31 31 68 34 34 34 ...
d k k a a 2 2 2 h 1 1 1 h 4 4 4 ...
Указатель str_int установлен на начало этого буфера.
При выполнении
переменная А будет содержать значение, состоящее из байтов буфера (0 .. 3), а именно 0x616b6b64.
Далее ты выполняешь
Что здесь происходит? В на 32-разрядных платформах размер unsigned int равен 4 байтам. Ты смещаешь указатель на 1 int (или на 4 байта) и пытаешься получить значение unsigned int располеженное в байтах буфера (4 .. 7). После этого переменная В будет содержать значение 0x32323261.
Из приведенной цитаты видно, что именно это значение ты и получаешь - самое последнее в выводе на экран:
dkkaa222h111h444c1122fffc111222333---1634429796---616b6b64
---616b6b00---616b6b00
616b6b00---32323261
Так что вариант с
(str_int +1) является единственно правильным.
Если же выполнить
str_int - 1, то указатель сместится на адрес памяти, который не имеет никакого отношения к буферу - на 4 байта раньше начала твоего буфера. Поэтому неудивителльно, что в этом случае ты получаешь непредсказуемый мусор 12fdc0:
2. Теперь по поводу строки "---616b6b00---616b6b00" и странного значения переменной А: 0x616b6b00.
У ifstream'ов есть "нехорошее" свойство - при достижении конца файла они не сразу возвращают eof, а разрешают еще одно считывание из файла, причем это считывание будет неправильным.
Поэтому правильно считывать как-нибудь так:
while(!in.eof())
{
in >> str;
if (in.good())
{
cout <<str<<"---";
str_int=(unsigned int *)str;
cout <<*str_int<<"---"<< hex<<*str_int<<"\n";
}
}
A=*str_int;
B=*(str_int+1);
in.close();
cout << "A = " <<A<<"--- B = "<<B;
В этом случае выдод на экран будет выглядеть так:
dkkaa222h111h444c1122fffc111222333---1634429796---616b6b64
A = 616b6b64--- B = 32323261
Тут все верно.