为什么以下两个函数中只有一个打印正确的转换:文本文件为16位和8位显示?

时间:2015-03-23 03:48:44

标签: c arrays prototype endianness

为什么我的程序主函数中只有以下两个函数中的一个才能打印正确的文本文件转换(只有单个字符'其中)到16和8位显示那个角色' e'?例如,它只打印:' e' = 101

101 = 01100101000000000 0000000000000000

0 = 00000000 00000000 00000000 00000000

它应该是: ' E' = 101

101 = 01100101000000000 0000000000000000

101 = 01100101 00000000 00000000 00000000

#include<stdio.h>
#include<stdlib.h>

void displaySixteenBits(char *value );//prototype
void displayEightBits( char *value );//prototype


int main(void)
{
   FILE *ptr_file;
   char buf[1000];

   ptr_file = fopen("input.txt","r");

   if (!ptr_file)
      return 1;

   while (fgets(buf,1000, ptr_file)!=NULL)
      printf("The file read: \t");
   printf("%s\n",buf);
   /*Only one of the following two lines of code prints*/
   displaySixteenBits( buf );
   displayEightBits( buf );

   fclose(ptr_file);
   return 0;

}//end main



/* Function to display text file character to 16 bits*/
void displaySixteenBits( char *value )
{
   char c;

   int displayMask = 1 << 31;

   printf( "%10u = ", *value );

   for ( c = 1; c <= 32; ++c ) {

      putchar( *value & displayMask ? '1' : '0' );
      *value <<= 1;

      if (c % 16 == 0 ){
         putchar( ' ' );
      }
   }

   putchar( '\n' );
}//end display sixteen bits

/* Function to display text file character to eight bits*/
void displayEightBits( char *value )
{
   char c;

   int displayMask =  1 << 31;

   printf( "%10u = ", *value );

   for ( c = 1; c <= 32; ++c ) {

      putchar( *value & displayMask ? '1' : '0' );
      *value <<= 1;

      if (c % 8 == 0 ){
         putchar( ' ' );
      }

   }

   putchar( '\n' );
}//end display eight bits

1 个答案:

答案 0 :(得分:0)

int displayMask = 1 << 31;可能会巧合地工作,充其量。在最糟糕的时候,它根本不会做你想做的事情。也许你的意思是unsigned long displayMask = 1UL << 31;

鉴于我们理解*valuechar,而displayMask的二进制值为0b10000000 00000000 00000000 00000000,以下内容显得非常可疑:

*value & displayMask有多少char的值足够大,需要32位?毕竟,也许你的意思是unsigned char displayMask = ~(UCHAR_MAX >> 1);。虽然我们注意到这一点,但将*value投射到那里的unsigned char可能是明智之举。

8似乎是一个神奇的数字。也许你的意思是CHAR_BIT?您可以在UCHAR_MAX标题中添加CHAR_BIT<limits.h>

printf( "%10u = ", *value );稍微不那么苛刻,但为了安全起见,将*value投射到unsigned int可能是个好主意。