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

Проблема. Пишу программу по отображению содержимого файла (любого формата) в бинарном виде. Создал 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

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


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

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

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

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

Значит надо вывести только те, что виджет знает, а остальные заменить на какую-то обманку, как @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 Вы “расконстантили” литерал и теперь можете случайно или намеренно испортить не только его, но и другие, совершенно посторонние литералы.

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

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

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

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

Да, форматируем как нам надо.
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удовольствие.