как перевести байты в int

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by байкал, 5 Mar 2008.

  1. байкал

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    Немного похоже на мою предыдущую тему.
    У меня есть буфер.

    Code:
    	unsigned char textBuffer[] = { 0x1,0x1,0x1,0x1}
    
    Но когда я пытаюсь его перевести в инт, получается 1.
    Code:
    	
    cout << "Converted: "<< (int)(*(buff + 3) >> 24 | *(buff + 2) >> 16 | *(buff + 1) >> 8 | *buff) << endl;
    
    Я думаю, что должно быть пятнадцать а не единица. Как можно исправить код?
     
    #1 байкал, 5 Mar 2008
    Last edited: 5 Mar 2008
  2. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    нужно
    *((int *)addr)
    где addr - указатель
    .... берет указатель типа char.... преобразует в его в указатель типа int и берет содержимое.

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

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

    почуствуй разницу ;)
     
    #2 Delimiter, 5 Mar 2008
    Last edited: 5 Mar 2008
    1 person likes this.
  3. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    >Я думаю, что должно быть пятнадцать а не единица. Как можно исправить код?

    это еще почему
     
    1 person likes this.
  4. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    он хотел сказать 257 :D
     
  5. байкал

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    Кстати, Delimiter, может ты имел ввиду (int)(*buff)? Всё равно единица получается.
     
  6. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    что я имел то я и ввел :D :p :)
     
  7. байкал

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    Я перепутал с 1111
     
  8. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    в твоем массиве
    для 2-х байтов имеем в шестнадцатиричном виде число 101=257 в десятиричной системе

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

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

    printf("%d",*((int *)textBuffer));
     
    #8 Delimiter, 6 Mar 2008
    Last edited: 6 Mar 2008
  9. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Да, кстати, ТС:

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

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

    x0man Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    33
    Likes Received:
    13
    Reputations:
    0
    Code:
    	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
    	}
    
    %)
     
    #10 x0man, 6 Mar 2008
    Last edited: 6 Mar 2008
  11. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    ужас какой-то... вот нынче споры пошли... толи настолько философко-умные, что я не понимаю, толи настолько тупые, что понимать не хочется да и не подходит сюда слово "понимать" ...

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

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    Слушай, KEZ, хватит мои темы портить. Иди в болталку. :)
     
  13. x0man

    x0man Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    33
    Likes Received:
    13
    Reputations:
    0
    юзай асм, шо тут думать то, без вариантов и вне конкуренции !!! ^_^