2013-11-21 3 views
4

해킹 을 읽는 동안 : 착취 (! 멋진 책)의 예술을, 나는이 기능을 통해 온 작성자 :이 기능의 작동 방식은 무엇입니까?

= = = = = = = = = = = = = = = = = = = = = = 
INPUT : OUTPUT 
= = = = = = = = = = = = = = = = = = = = = = 
0  : 00000000 00000000 00000000 00000000 
2  : 00000000 00000000 00000000 00000010 
1  : 00000000 00000000 00000000 00000001 
1024 : 00000000 00000000 00000100 00000000 
512 : 00000000 00000000 00000010 00000000 
64 : 00000000 00000000 00000000 01000000 
= = = = = = = = = = = = = = = = = = = = = = 

: 여기

void binary_print(unsigned int value) { 
    unsigned int mask = 0xff000000; // Start with a mask for the highest byte. 
    unsigned int shift = 256*256*256; // Start with a shift for the highest byte. 
    unsigned int byte, byte_iterator, bit_iterator; 

    for(byte_iterator=0; byte_iterator < 4; byte_iterator++) { 
     byte = (value & mask)/shift; // Isolate each byte. 
     printf(" "); 
     for(bit_iterator=0; bit_iterator < 8; bit_iterator++) { // Print the byte's bits. 
     if(byte & 0x80) // If the highest bit in the byte isn't 0, 
      printf("1");  // print a 1. 
     else 
      printf("0");  // Otherwise, print a 0. 
     byte *= 2;   // Move all the bits to the left by 1. 
     } 
     mask /= 256;  // Move the bits in mask right by 8. 
     shift /= 256;  // Move the bits in shift right by 8. 
    } 
} 

는 함수에 대한 입력 - 출력 테이블의 이것은 binary_print()가 10 진수를 2 진수로 변환한다는 것을 알고 있습니다.

하지만 이해가 안됩니다 정확히 함수가 정답을 찾습니다. 구체적으로 :

  • 마스크 란 무엇입니까? 작성자는 0xff000000 값에 어떻게 도달 했습니까? (0xff000000은 시스템의 int 값의 최대 값 인 2^32에 가까워졌습니다.)
  • 교대 란 무엇입니까? 256^3으로 초기화하는 이유는 무엇입니까? 는
  • 실제로이 라인에 어떻게됩니까
  • (이것은 16 진수로 장소 무게와 함께 할 수있는 뭔가가 같은 나에게 보인다) :
    • 바이트 = (값 & 마스크)/이동
    • 바이트 & 0x80으로

즉, 나는 변환을 수행하는 데 사용) (에게 방법 binary_print을 이해하고 싶습니다.

+2

C 세계에도 @ e-satis가 있는가? (http://stackoverflow.com/users/9951/e-satis).예를 들어,이 질문에는 python yield 키워드에 대한 대답과 같은 대답이 필요합니다. http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained/231855#231855 – Yavar

+0

MSDN : [C 비트 연산자 ] (http://msdn.microsoft.com/en-us/library/17zwb64t.aspx) 및 [비트 시프트 연산자] (http://msdn.microsoft.com/en-us/library/f96c63ed.aspx) Wikipedia : [바이너리 계산] (http://en.wikipedia.org/wiki/Binary_number#Counting_in_binary) :) – parrowdice

답변

6

비트가 mask (32 비트 시스템에서) 0xff000000은 최상위 바이트로 모두 1 비트입니다. shift0x1000000 (예 : 256 * 256 * 256)으로 초기화됩니다.

byte = (value & mask)/shift은 bit-and를 사용하여 마스크의 비트를 추출한 다음 0과 0xff 사이의 값을 얻기 위해 이들을 시프트합니다 (8 비트 바이트로 맞추기).

unsigned의 경우 mask /= 256mask = mask >> 8과 같으며 일반적으로 컴파일러는 처음부터 두 번째를 최적화합니다.

이해하는 가장 좋은 방법 정확하게 모든 경고와 코드를 컴파일 할 수 일어나고 단계에서 프로그램 단계를 실행하는 디버거 (gdb)를 사용하고 관련 상태를 표시 (예 gcc -Wall -g)와 에 정보를 디버깅 무엇 .

3

이것은 답변이 아닙니다. 나는 문제의 책을 보지 못했기 때문에, 그 코드 발췌 내용이 무엇을 보여 주어야하는지는 잘 모르겠다. 그러나 그것은 원하는 결과물을 생산하는 데 매우 지나치게 정교한 방법이다.

은 여기 간단한 하나 너무 기괴한없는 마지막 줄에있는 해킹에서 제외

void binary_print(unsigned value) { 
    for (unsigned mask = 0x80000000; // High order bit 
     mask;      // While we have a bit 
     mask >>= 1) {    // Shift right to next bit position 
    if (value & mask) putchar('1'); // Bit is set: print a 1 
    else    putchar('0'); // Bit is not set: print a 0 
    if (mask & 0x01010100) putchar(' '); // A space if we just did the 
             // low order bit of some byte 
    } 
} 

, 나는 희망, 나는 논리가 비트 operations.printf에 익숙한 사람을위한 아주 간단해야한다고 생각 과잉이다

관련 문제