2013-09-23 2 views
3

C에서 기존 코드를 변환하려면 다음을 수행하려면 찾고 : 주소를 인쇄하는 16 진수 덤프 프로그램을 쓰려고합니다 : 인쇄 할 수있는 문자 값.한 번에 2 바이트 16 진수 인쇄

0003540: 05 04 06 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ...unsigned char 

원하는 진수 출력 : 쌍

0003540: 0504 0675 6e73 6967 6e65 6420 6368 6172 ...unsigned char 

현재 코드 인쇄 :

addr = 0; 
    while ((cnt = (long) 
    fread (buf, sizeof (unsigned char), 16, filein)) > 0) { 

    b = buf; 
    /* Print the address in hexadecimal. */ 
    fprintf (fileout, "%07lx ", addr); 
    addr = addr + 16; 
    /* Print 16 data items, in pairs, in hexadecimal. */ 
    cnt2 = 0; 
    for (m = 0; m < 16; m++) { 
     cnt2 = cnt2 + 1; 
     if (cnt2 <= cnt) { 
     fprintf (fileout, "%02x", *b++); 
     } 
     else { 
     fprintf (fileout, " "); 
     } 
     fprintf (fileout, " "); 
    } 
    /* Print the printable characters, or a period if unprintable. */ 
    fprintf (fileout, " "); 
    cnt2 = 0; 
    for (n = 0; n < 16; n++) { 
     cnt2 = cnt2 + 1; 
     if (cnt2 <= cnt) { 
     if ((buf[n] < 32) || (buf[n] > 126)) { 
      fprintf (fileout, "%c", '.'); 
     } 
     else { 
      fprintf (fileout, "%c", buf[n]); 
     } 
     } 
    } 
    fprintf(fileout, "\n"); 
    } 

어떻게 이것을 변경할 수 현재 값에 대한 코드는 다음과 같은 형식의 인쇄입니다 코드 AB12 CD34 형식을 달성하기 위해? 감사합니다.

+2

fprintf (fileout, "% 02x % 02x", * b ++, * b ++) 변수 이름을 모르겠다 ... – Tawnos

+0

안녕 Tawnos, 변수를 더 명확하게 설명하는 전체 코드는 여기 [link] (http://orion.math.iastate.edu/burkardt/c_src/)에서 찾을 수 있습니다. hexdump/hexdump.c) – simplicity

+2

@ Tawnos 그 구체적인 동작이 아닌가요? –

답변

2

사용 m가 일 때 만의 공간을 쓰기 2로 나누어 경우 테스트 할 수있는 모듈로 (나머지) 연산자 % :

for (m = 0; m < 16; m++) { 
    if (m > 0 && m % 2 == 0) { 
    fprintf (fileout, " "); 
    } 
    fprintf (fileout, "%02x", *b++); 
} 

편집 3 :

for (m = 0; m < 16; m++) { 
    if (m > 0 && m % 2 == 0) { 
    fprintf (fileout, " "); // space between every second byte 
    } 
    if (m < cnt) { 
    fprintf (fileout, "%02x", *b++); 
    } else { 
    fprintf (fileout, " "); // blank if run out of bytes on this line 
    } 
} 
+0

Boann에게 감사 드려도, 이전 코드에 어느 부분이 들어 맞을지 또는 완전히 대체 할 수 있는지 명확히 할 수 있습니까? if (cnt2 <= cnt)는 값이 16 진수 덤프 될 문자의 크기까지만 인쇄되도록합니다 (cnt로 나타냄). 따라서 한 번에 2 쌍씩 인쇄하면서 if (cnt2 <= cnt) 확인을 유지하는 방법을 명확히 할 수 있습니까? 감사! – simplicity

+0

@ 단순함 나는 따라갈 지 모르겠다. 16 바이트 만 원합니까, 아니면'cnt' 바이트를 원합니까, 아니면 더 적게 줄 것인가, 아니면'cnt' 바이트를 원하지만 라인 당 16 *을 원합니까? – Boann

+0

최대 16 개까지 줄 수 있습니다. – simplicity

0

내가이 할 수있는 생각 꽤 단순화시켜야합니다. 예를 들어, 다음과 같이 시작하는 것이 좋습니다 :

#include <stdio.h> 
#include <ctype.h> 

int main(){ 
    char buffer[17]; 
    size_t bytes; 
    int i; 
    while (0 < (bytes = fread(buffer, 1, 16, stdin))) { 
     for (i = 0; i < bytes/2; i++) // print out bytes, 2 at a time 
      printf("%02x%02x ", buffer[i * 2], buffer[i * 2 + 1]); 
     if (i * 2 < bytes)    // take care of (possible) odd byte 
      printf("%02x ", buffer[i * 2]); 

     for (; i < 8; i++)    // right pad hex bytes 
      printf("  "); 

     for (i = 0; i < bytes; i++)  // change unprintable to '.' 
      if (!isprint(buffer[i])) 
       buffer[i] = '.'; 

     buffer[i] = '\0';    // terminate string 
     printf("\t%s\n", buffer); // print out characters 
    } 
    return 0; 
} 
관련 문제