3

C の既存のコードを変換して、次のことを実行したいと考えています。現在、値のコードは次の形式で出力されています。

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

目的の 16 進出力:

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 フォーマットを実現するにはどうすればよいですか? ありがとう!

4

2 に答える 2

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
  }
}
于 2013-09-23T01:25:01.717 に答える