PDA

Просмотр полной версии : как перевести байты в int


байкал
05.03.2008, 21:41
Немного похоже на мою предыдущую тему.
У меня есть буфер.

unsigned char textBuffer[] = { 0x1,0x1,0x1,0x1}


Но когда я пытаюсь его перевести в инт, получается 1.

cout << "Converted: "<< (int)(*(buff + 3) >> 24 | *(buff + 2) >> 16 | *(buff + 1) >> 8 | *buff) << endl;


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

Delimiter
05.03.2008, 22:57
нужно
*((int *)addr)
где addr - указатель
.... берет указатель типа char.... преобразует в его в указатель типа int и берет содержимое.

небольшое.... уточнение по твоему коду (у тебя)
(int )*addr

.... берет адрес .... получает байт .... превращает его в инт. :cool:

почуствуй разницу ;)

_Great_
05.03.2008, 23:22
>Я думаю, что должно быть пятнадцать а не единица. Как можно исправить код?

это еще почему

Delimiter
05.03.2008, 23:25
он хотел сказать 257 :D

байкал
06.03.2008, 01:03
Кстати, Delimiter, может ты имел ввиду (int)(*buff)? Всё равно единица получается.

Delimiter
06.03.2008, 01:05
что я имел то я и ввел :D :p :)

байкал
06.03.2008, 01:09
>Я думаю, что должно быть пятнадцать а не единица. Как можно исправить код?

это еще почему
Я перепутал с 1111

Delimiter
06.03.2008, 01:17
в твоем массиве
для 2-х байтов имеем в шестнадцатиричном виде число 101=257 в десятиричной системе

для четырех байтов (long) имеем число в шестнадцатирияном виде 1010101 в десятеричной системе 16843009

unsigned char textBuffer[] = { 0x1,0x1,0x1,0x1};

printf("%d",*((int *)textBuffer));

_Great_
06.03.2008, 09:02
Да, кстати, ТС:

>> cout << "Converted: "<< (int)(*(buff + 3) >> 24 | *(buff + 2) >> 16 | *(buff + 1) >> 8 | *buff) << endl;

когда ты пишешь (int) перед выражением, то к инту кастуется только непосредственная первая часть выражения.
То есть: (type)( ........... )
+ рекомендую объединять в скобки части выражения, участвующие в логических битовх операциях ? | ^
То есть писать лучше так (......) | (......) | (......)

x0man
06.03.2008, 09:38
char buff[] = {0, 1, 2, 3};
int buff_dword;

__asm
{
push eax

mov eax, dword ptr [buff]

xchg al, ah
rol eax, 16
xchg al, ah

mov buff_dword, eax

pop eax
}

%)

KEZ
06.03.2008, 09:42
ужас какой-то... вот нынче споры пошли... толи настолько философко-умные, что я не понимаю, толи настолько тупые, что понимать не хочется да и не подходит сюда слово "понимать" ...

в стиле "как преобразовать единицу в двойку без прибавления единицы ..." - "вычесть минус один в квадрате ..."
*(int*)&intvar = 1*1*1;

байкал
06.03.2008, 10:02
ужас какой-то... вот нынче споры пошли... толи настолько философко-умные, что я не понимаю, толи настолько тупые, что понимать не хочется да и не подходит сюда слово "понимать" ...

в стиле "как преобразовать единицу в двойку без прибавления единицы ..." - "вычесть минус один в квадрате ..."
*(int*)&intvar = 1*1*1;
Слушай, KEZ, хватит мои темы портить. Иди в болталку. :)

x0man
06.03.2008, 10:14
юзай асм, шо тут думать то, без вариантов и вне конкуренции !!! ^_^