Отображение файла в бинарном виде

Проблема. Пишу программу по отображению содержимого файла (любого формата) в бинарном виде. Создал Text area где как раз и вывожу содержимое файла. Но не отображаются символы кроме стандартного языка. Подскажите пожалуйста, что нужно подключить или изменить чтобы было полное отображение. Пример : Total commander + F3.

   lv_obj_t* Text = lv_textarea_create(lv_scr_act());
   lv_textarea_set_text_selection(Text, true);
   lv_obj_set_size(Text, 1000, 500);

   ifstream ifs(FilePath, ios::binary);

   if (ifs)
   {
       //Получаем размер файла
       ifs.seekg(0, std::ios::end);
       streamsize size = ifs.tellg();
       ifs.seekg(0, std::ios::beg);

       //Создаем вектор для содержимого файла
       vector <char> buffer(size);

       //Читаем из файла
       if (ifs.read(buffer.data(), size))
       {
           lv_textarea_add_text(Text, buffer.data());
       }
       else {

           lv_textarea_add_text(Text, "Ups!");

       }

       ifs.close();
   }

почему сообщение размещено в разделе “Обратная связь”? Оно как-то связано с администрацией форума?

где отображаете? при чем тут ардуиино?

что за символы, если файл в бинарном виде? В бинарном виде есть только 0 и 1

1 лайк

Отображаю в виджете библиотеки lvgl под названием Textarea.


Вот что должно отображаться, но виджет не может определить символы и соответственно их вывести.

Прошу прощение за неправильный раздел. Первый раз пишу и после анализа некоторых разделов выбрал эту и оказалось перепутал.

Это не бинарный вид.

видишь там точки в тексте - это не точки, точнее не все из них точки, просмотрщик так отображает все непечатаемые символы, их намного больше чем видимых, ты бы почитал про кодировки текста.

1 лайк

Значит надо вывести только те, что виджет знает, а остальные заменить на какую-то обманку, как @flexprint выше описал.
То есть вам нужно обработать файл перед выводом на экран

Это если вы хотите такой вид, как выше.
Только это, как я уже писал, нифига не “бинарный” вид. Бинарное представление для показа файлов вообще обычно не используется, гораздо более популярно шестнадцатиричное

Кстати, как вы можете догадаться, при показе в HEX никаких проблем с кодировкой нет и быть не может

Возможно , те, кто знает С++ , засмеют, но на С делал так:

Спойлер
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"


int main()
{
	
	char *textT = "ABBA";
	
		while(*textT !=NULL)
		{
			unsigned char b = *textT;
			for (int i = 0; i < 8; i++) {
				printf("%c", (b & 0x80) ? '1' : '0');
				b <<= 1;
			}
			textT++;
		}
		
  return 0;
}
Спойлер

Screenshot_174

Естественно, форматировать как надо

Спасибо, понял!

Ох, опасное это дело!

на грабли налететь, как два пальца!

Объясните пжлст
P.S. Возможно надо
const char * textT

Именно так и надо, т.к. без const Вы “расконстантили” литерал и теперь можете случайно или намеренно испортить не только его, но и другие, совершенно посторонние литералы.

Мы такой пример недавно обсуждали. Там случайно портился литерал, казалось бы, никакого отношения к нам не имеющий и сидящий в системной библиотеке так, что мы его никогда и не видим. Сильно не вдруг-то догадаешься что произошло.

1 лайк

Вот именно. А как бинарный то?

Спасибо что напомнили. Сосредоточился на выводе BIN, и пропустил

А точно так же, только в С++ принято вместо printf использовать cout<<.
А вообще, еще бы отделить байты друг от друга хотя бы пробелами.

2 лайка

Да, форматируем как нам надо.
myBinPrint.c

Спойлер
#define _CRT_SECURE_NO_WARNINGS
//#include "stdafx.h"
#include <stdio.h>
#include <string.h>

int main()
{
	FILE *file;
	char buf[20];
	int ind = 0;
	char width = 0;
	file = fopen("ABBA.txt", "rb");

	while(fread(&buf[ind],sizeof(char),1,file)==1)
	{
		char b;

		b = buf[ind];
		for (int i = 0; i < 8; i++)
		{
			printf("%c", (b & 0x80) ? '1' : '0');
			b <<= 1;
		}
		printf("%c", ' ');
		ind++;
		width++;
		if(width >= 4)
		{
			printf("%c", '\n');
			width = 0;
		}

	}
	fclose(file);
	return 0;
}

ABBA.txt

Спойлер
ABBA ABBA ABBA ABBA
Спойлер

Просто недавно писал подобное для ардуино, т.к Serial.print(num, BIN) не устраивал тем, что скрывает нули перед первой 1.

Я вывожу в более привычном для себя виде, используя таблицу ascii символов, отображая, например, 0x10 как LF, 0х13 как СR, 0x07 как BEL - так проще ориентироваться - сразу видно где CR где TAB

Результат вывода можно увидеть?

Вы уверены, что если TAB назвать HT, то ориентироваться буде проще, чем если оставить его 09?
ИSP-SPда,SPчитатьSPтекстыSPвSPкоторыхSP"SP"SPвместоSPпробелаSP-SPтоSPещеSPудовольствие.