yagami_md Ответов: 2

Fputc двоичный код в ascii в программировании на языке Си


привет друзья
у меня есть файл на языке Си , этот файл содержит двоичный байт, он означает только 0 и один !
я хочу собрать каждые 8 байт в ASCII и сохранить в другом файле !
спасибо

Что я уже пробовал:

bit_files *tmp;
tmp = (bit_files *)malloc(sizeof(bit_files));
char a;
FILE *first_file,*final_file;
first_file=fopen("file1","r");
final_file=fopen("file2","w");
		
            tmp->bitBuffer <<= 1;
            tmp->bitCount = 0;
			
while (a=fgetc(first_file)!=EOF)
{
	if (a==0)
	{
	tmp->bitBuffer=tmp->bitBuffer<<=1;
	}
	else
	{
		tmp->bitBuffer=tmp->bitBuffer|=1;
	}
	tmp->bitCount++;
	if (tmp->bitCount==8)
	{
		fputc(tmp->bitBuffer,final_file);
		tmp->bitBuffer=0;
		tmp->bitCount=0;
	}
}
fclose(first_file);
fclose(final_file);

Patrice T

Покажите пример вашего " двоичного файла"
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

2 Ответов

Рейтинг:
12

OriginalGriff

"Двоичный файл" не содержит только ноль и 1, он содержит двоичные данные - это значения без знака char, каждое из которых содержит от 0 до 255 включительно. Если ваши данные действительно являются двоичными значениями 0 и 1 только на байт, то все, что вам нужно сделать, это выполнить цикл сбора каждых восьми битов в беззнаковом Символе с помощью оператора <<, чтобы переместить каждый бит на место, а затем записать каждый собранный байт на ваш вывод, когда он будет закончен.

Но я бы начал с просмотра вашего двоичного файла с помощью шестнадцатеричного редактора, чтобы убедиться, что вы не просто путаете все приложение!


yagami_md

вы можете изменить мой код, чтобы он был похож на то, что вы говорите?

OriginalGriff

Да, мог бы , но это твоя работа, а не моя.
И это не совсем сложно. Я бы действительно начал с проверки ваших входных файлов...

Рейтинг:
10

Richard MacCutchan

Более простой способ состоял бы в том, чтобы читать восемь байтов за раз и собирать ascii из младших битов, что-то вроде:

char			inputBuffer[8];
char			temp;
FILE*			binin;
int				i;

binin = fopen("ctest.txt", "rb");
if (binin == NULL)
    exit(1);
do
{
    int nIn = fread(inputBuffer, sizeof(char), sizeof inputBuffer, binin);
    if (nIn < sizeof inputBuffer)
    break;
    temp = 0;
    for (i = 0; i < 8; ++i)
    {
        temp |= (inputBuffer[i] & 1) << (7 - i);
    }
    printf("%c", temp);
} while(1);
printf("\n");


yagami_md

моя программа на visual studio 2010, c langage

Richard MacCutchan

Я изменил код, чтобы использовать чистый Си; пожалуйста, попробуйте прямо сейчас.

yagami_md

большое вам спасибо , все хорошо
Спасибо, брат, ты хороший программист, спасибо за твою помощь

Richard MacCutchan

Рад помочь. Не очень хорошо, но я уже давно этим занимаюсь.