Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++ - Страница 2
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++

Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++

Ответ
Поиск в этой теме
Непрочитано 26.10.2023, 10:02
Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++
iliorik
 
Регистрация: 03.10.2009
Сообщений: 733

Написал программу для вычисления CRC32-IEEE. Может кому нужно будет для экспертизы.
В приложении файлы, которые нужно распаковать на диск С:, зайти в папку с файлами (C:\CRC32), и запустить файл "CRC32.reg".
Далее нажать "Да/Yes" и "Ок".
Есть ли предложения по улучшению или оптимизации кода?
Может есть возможность написания программы по формированию ИУЛ в формате doc или pdf для файла? Куда посмотреть, какие библиотеки и коды включить?

Код:
[Выделить все]
 
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <locale.h>
#include <windows.h>

using namespace std;

static const unsigned int crc32tab[256] = {
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};

unsigned int crc32(unsigned char* buf, unsigned int size)
{
	unsigned int crc = 0xFFFFFFFF;
	for (unsigned int i = 0; i < size; i++)
	{
		crc = crc32tab[(crc ^ buf[i]) & 0xFF] ^ (crc >> 8);
	}
	return crc ^ 0xFFFFFFFF;
}

int main(int argc, char* args[])
{
	std::string dummy;
	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	std::string filename = "";
	for (int i = 1; i < argc; i++)
	{
		filename += args[i];
		filename += ' ';
	}
	if (argc < 2)
	{
		cout << args[0] << endl;
		cout << filename << endl;
		cout << "Error: no file path specified" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	ifstream file(filename, ios::binary);
	if (!file.is_open())
	{
		cout << args[0] << endl;
		cout << filename << endl;
		cout << "Error: file not found" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	file.seekg(0, ios::end);
	unsigned int size = file.tellg();
	file.seekg(0, ios::beg);

	unsigned char* buf = new unsigned char[size];
	file.read((char*)buf, size);
	file.close();

	unsigned int crc = crc32(buf, size);

	stringstream ss;
	ss << uppercase<< hex << crc /*the CRC32 number that you have computed somewhere*/;

	std::string resultString = ss.str();
	const char* output = resultString.c_str();
	const size_t len = strlen(output) + 1;
	HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
	memcpy(GlobalLock(hMem), output, len);
	GlobalUnlock(hMem);
	OpenClipboard(0);
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hMem);
	CloseClipboard();

	//cout << args[0] << endl;
	cout << "File: " << endl;
	cout << filename << endl;
	cout << endl;
	cout  << "CRC32-IEEE: " << endl;
	cout << resultString << endl;
	cout << endl;

	

	std::cout << "Код скопирован в буфер обмена" << std::endl;
	std::getline(std::cin, dummy);

	return 0;
Код обновлён в сообщении ниже

Вложения
Тип файла: zip CRC32.zip (136.4 Кб, 116 просмотров)

__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением

Последний раз редактировалось iliorik, 20.06.2024 в 14:02.
Просмотров: 7215
 
Непрочитано 21.06.2024, 11:54
#21
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Offtop: Осталось только дописать парсер pdf файлов и генерацию таблицы в соответствии с ГОСТ, как то так:
Миниатюры
Нажмите на изображение для увеличения
Название: 95ee48c405df0b02073f465be56bbc01[1].png
Просмотров: 273
Размер:	32.4 Кб
ID:	263503  
Boxa вне форума  
 
Автор темы   Непрочитано 21.06.2024, 12:25
#22
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Boxa Посмотреть сообщение
дописать парсер pdf файлов
Круто. Всё с кнопочками и как надо
Можешь код на с++ из класса DocProps взять. Он собирает нужные данные по файлу
Хотя на с# некоторые моменты будет проще написать. Например дату и время изменения файла
Код:
[Выделить все]
 #include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <locale.h>
#include <windows.h>
//для времени и даты файла
#include <chrono>
#include <ctime>
#include <filesystem>
//для записи в rtf файл 
#include <regex>

using namespace std;

//const int buffer_size = 1048576; // 1 МБ
const int buffer_size = 512*1024; // 512 КБ


unsigned int crc32(unsigned int crc, const unsigned char* buf, size_t size) {
	static unsigned int table[256];

	if (!table[1]) {
		unsigned int poly = 0xEDB88320;
		for (size_t i = 0; i < 256; ++i) {
			unsigned int c = i;
			for (size_t j = 0; j < 8; ++j) {
				c = (c & 1) ? (poly ^ (c >> 1)) : (c >> 1);
			}
			table[i] = c;
		}
	}

	crc = crc ^ 0xFFFFFFFF;
	for (size_t i = 0; i < size; ++i) {
		crc = table[(crc ^ buf[i]) & 0xFF] ^ (crc >> 8);
	}

	return crc ^ 0xFFFFFFFF;
}

class DocProps
{
	template <typename TP>
	std::time_t to_time_t(TP tp)
	{
		using namespace std::chrono;
		auto sctp = time_point_cast<system_clock::duration>(tp - TP::clock::now()
			+ system_clock::now());
		return system_clock::to_time_t(sctp);
	}
public:
	string changesDate;
	string changesTime;
	string crcCode;
	string name;
	string filename;
	string path_to_file;

	//вычисляем crc код и записываем в crcCode
	void crcRead()
	{
		ifstream file(path_to_file, ios::binary);
		if (!file.is_open())
		{
			cout << path_to_file << endl;
			cout << "Error: file not found" << endl;
		}
		else
		{
			unsigned char buffer[buffer_size];
			unsigned int crc = 0x0000000;

			while (!file.eof()) {
				file.read(reinterpret_cast<char*>(buffer), buffer_size); // Считываем данные из файла в буфер
				size_t bytes_read = file.gcount(); // Получаем количество считанных байт
				crc = crc32(crc, buffer, bytes_read); // Вычисляем crc32 для считанных данных
			}

			file.close();

			stringstream ss;
			ss << uppercase << hex << crc << dec  /*the CRC32 number that you have computed somewhere*/;

			crcCode = ss.str();
			crcCode = std::string(8 - crcCode.length(), '0') + crcCode; //зполняем нулями начало, если нет символов
		}
	}

	//записываем имя файла в переменную filename
	void readName()
	{
		size_t found = path_to_file.find_last_of("\\");
		filename = path_to_file.substr(found + 1);
		//убираем расширение
		size_t pos = filename.find_last_of('.');
		if (pos != string::npos) { // If a dot is found
			name = filename.substr(0, pos); // Remove the extension by getting a substring from the beginning to the last dot position
		}
	}
	void readTimeDataChanges()
	{
		std::filesystem::file_time_type ftime = std::filesystem::last_write_time(path_to_file);
		std::time_t tt = to_time_t(ftime);
		std::tm* tm = std::localtime(&tt);

		char dateChanges[11];
		std::strftime(dateChanges, 11, "%d.%m.%Y", tm);
		changesDate = dateChanges;

		char timeChanges[6];
		std::strftime(timeChanges, 6, "%H:%M", tm);
		changesTime = timeChanges;
	}
	void readProps()
	{
		readName();
		readTimeDataChanges();
	}
};

void changeRTF(DocProps dp_, string filename_)
{
	std::ifstream inFile(filename_);
	std::string content((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
	inFile.close();

	std::regex fileNameRegex("\\$FileName");
	content = std::regex_replace(content, fileNameRegex, dp_.filename);

	std::regex nameRegex("\\$Name");
	content = std::regex_replace(content, nameRegex, dp_.name);

	std::regex crcCodeRegex("\\$ControlSumm");
	content = std::regex_replace(content, crcCodeRegex, dp_.crcCode);

	std::regex dateRegex("\\$Date");
	content = std::regex_replace(content, dateRegex, dp_.changesDate);

	std::regex timeRegex("\\$Time");
	content = std::regex_replace(content, timeRegex, dp_.changesTime);

	std::ofstream outFile(dp_.name+"-УЛ.rtf");
	outFile << content;
	outFile.close();
}

int main(int argc, char* args[])
{
	std::string dummy;
	//setlocale(LC_ALL, "Russian");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	DocProps dp;

	dp.path_to_file = "";
	for (int i = 1; i < argc; i++)
	{
		dp.path_to_file += args[i];
		dp.path_to_file += ' ';
	}
	if (argc < 2)
	{
		cout << args[0] << endl;
		cout << dp.path_to_file << endl;
		cout << "Error: no file path specified" << endl;
		std::getline(std::cin, dummy);
		return 0;
	}

	dp.crcRead();
	dp.readProps();
	std::filesystem::path thisPath = std::filesystem::current_path();
	changeRTF(dp, "Example.rtf");
	
	const char* output = dp.crcCode.c_str();
	const size_t len = strlen(output) + 1;
	HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
	memcpy(GlobalLock(hMem), output, len);
	GlobalUnlock(hMem);
	OpenClipboard(0);
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hMem);
	CloseClipboard();

	//cout << args[0] << endl;
	cout << "File: " << endl;
	cout << dp.filename << endl;
	cout << endl;
	cout << "CRC32-IEEE: " << endl;
	cout << dp.crcCode << endl;
	cout << endl;
	cout << "Date: " << endl;
	cout << dp.changesDate << endl;
	cout << endl;
	cout << "Time: " << endl;
	cout << dp.changesTime << endl;
	cout << endl;
	cout << "Path to file: " << endl;
	cout << dp.path_to_file << endl;
	cout << endl;



	std::cout << "Код скопирован в буфер обмена" << std::endl;
	std::getline(std::cin, dummy);

	return 0;
}
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением

Последний раз редактировалось iliorik, 21.06.2024 в 12:30.
iliorik вне форума  
 
Непрочитано 21.06.2024, 12:54
#23
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от iliorik Посмотреть сообщение
Можешь код на с++ из класса DocProps взять. Он собирает нужные данные по файлу
Хотя на с# некоторые моменты будет проще написать. Например дату и время изменения файла
Посмотрел код... вот тут непонятка, дату изменения файла, нельзя брать из файловой системы, т.к. файл может быть просто перенесен или скопирован, дату изменения нужно брать из внутренних свойств самой пдфки, у нее там это есть.
И есть куда развиваться, т.к. имя файла, дата изменения и CRC32-IEEE - маловато =)
Вкус приходит во время еды... У себя я сделал, что парсятся титульники, штампы всех листов внутри пдф-ки и на основе полученных данных формируются графы таблицы: шифр, наименования, характера работ, ФИО исполнителей (на картинке я фамилии руками заменил на ###) и все остальное...
Boxa вне форума  
 
Автор темы   Непрочитано 21.06.2024, 13:16
#24
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Boxa Посмотреть сообщение
Посмотрел код... вот тут непонятка, дату изменения файла, нельзя брать из файловой системы, т.к. файл может быть просто перенесен или скопирован, дату изменения нужно брать из внутренних свойств самой пдфки, у нее там это есть.
У нас экспертиза сверяет дату изменения из файловой системы. При копировании pdf, дата изменения остаётся и не меняется, пока его не пересохранят. К тому же не только файлы pdf нужно передавать. Например xml, или zip архив с BIM моделью. И как с ними быть?

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
Вкус приходит во время еды... У себя я сделал, что парсятся титульники, штампы всех листов внутри пдф-ки и на основе полученных данных формируются графы таблицы: шифр, наименования, характера работ, ФИО исполнителей (на картинке я фамилии руками заменил на ###) и все остальное...
Это несомненно так. Но для этого должен быть стандарт разработки документов определённый. Возможно я попробую нейросетку написать, которая из титульника будет название объекта и название раздела брать. Но это когда я начну нейросети изучать (думаю как раз там на C# писать буду).
Пока что хочется какой то более универсальный инструмент разработать. Что бы правой кнопкой мышки на файл нажал, выбрал нужный пункт в контекстном меню, и рядом появился ИУЛ (при этом независимо, есть ли microsoft или нет)
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением
iliorik вне форума  
 
Непрочитано 21.06.2024, 13:24
#25
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Как быть не знаю, но бывает и вот такая ситуация: см вложение и потому у нас экспертиза требует внутреннюю дату изменений из пдфки
Миниатюры
Нажмите на изображение для увеличения
Название: 111.png
Просмотров: 54
Размер:	18.5 Кб
ID:	263504  
Boxa вне форума  
 
Автор темы   Непрочитано 21.06.2024, 14:22
#26
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Boxa Посмотреть сообщение
Как быть не знаю, но бывает и вот такая ситуация: см вложение и потому у нас экспертиза требует внутреннюю дату изменений из пдфки
Если немножко поковыряться в файлах, эти даты можно изменить любым блокнотом. Как по мне именно они не о чём не говорят. Всё таки данные о файле из файловой системы тяжелее подделать (если мы говорим о достоверности последних внесённых изменений в файл).
Но если нужно будет, при помощи с++ считать такое из файла значит тоже не сложно будет. Главное понять как эти метаданные сохранены в pdf
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot 2024-06-21 141420.png
Просмотров: 27
Размер:	104.1 Кб
ID:	263505  Нажмите на изображение для увеличения
Название: Screenshot 2024-06-21 142034.png
Просмотров: 25
Размер:	12.7 Кб
ID:	263506  
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением

Последний раз редактировалось iliorik, 21.06.2024 в 14:35.
iliorik вне форума  
 
Непрочитано 21.06.2024, 15:58
1 | #27
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,069


По устройству PDF есть краткое руководство от авторов: https://www.adobe.com/technology/pdf...DFTutorial.pdf. Это если есть желание свой PDF-писатель с нуля сделать, чтобы ни от кого не зависеть.

Но скорее всего, есть готовые библиотеки для чтения/записи. Писать с нуля какой-нибудь код упаковки Deflate или zip - это совсем для мазохистов. Под шарп я использовал https://itextpdf.com/, (тут и тут) под плюсы не подскажу, надо гуглить.

С датами у меня на прошлой работе техотдел всех тренировал, еще до того, как это стало государственным геморроем. Даты смотрели кто попало и где попало. Одним подавай в свойствах файла, другим внутри PDF. Были даже случаи, когда даты по-разному округлялись в разных программах из-за спорных микросекунд, и техотдел заставлял переделывать PDF, потому что "даты неправильные, тут одна минута написана, а у файла целых две". Очевидно, в программе придется сделать настройки на несколько экранов, что делать с датами - заменять, унифицировать, рандомизировать и т.д. по списку всех возможных идиотских предложений.
Нубий-IV вне форума  
 
Автор темы   Непрочитано 21.06.2024, 16:32
#28
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
По устройству PDF есть краткое руководство от авторов: https://www.adobe.com/technology/pdf...DFTutorial.pdf. Это если есть желание свой PDF-писатель с нуля сделать, чтобы ни от кого не зависеть.
Спасибо. Гляну. Но как я понял там не так сложно всё, если не зашифровано.

Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Но скорее всего, есть готовые библиотеки для чтения/записи. Писать с нуля какой-нибудь код упаковки Deflate или zip - это совсем для мазохистов. Под шарп я использовал https://itextpdf.com/, (тут и тут) под плюсы не подскажу, надо гуглить.
Вот не хотелось бы из за пары строк, которые спарсить можно, библиотеками приложение нагружать. Хотя ничего плохого в этом нет, но всё же. Хочется легковесных решений.

Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
С датами у меня на прошлой работе техотдел всех тренировал, еще до того, как это стало государственным геморроем. Даты смотрели кто попало и где попало. Одним подавай в свойствах файла, другим внутри PDF. Были даже случаи, когда даты по-разному округлялись в разных программах из-за спорных микросекунд, и техотдел заставлял переделывать PDF, потому что "даты неправильные, тут одна минута написана, а у файла целых две". Очевидно, в программе придется сделать настройки на несколько экранов, что делать с датами - заменять, унифицировать, рандомизировать и т.д. по списку всех возможных идиотских предложений.
Все требуют эти даты и по разному (у каждой экспертизы свои требования), как будто эти даты что то дают, их какие угодно в файле вписать нельзя. Вот crc-ieee или md5 метод проверки файла, другое дело. Тут уже так просто не подгонишь файл. Ну и всегда понятно какой именно файл был на проверке.
Опять же, несколько раз просмотрел ГОСТ 2.051-2013. Про даты ни слова ни полей не нашёл. Описали бы какие даты имеются ввиду. Откуда эти даты вообще в ИУЛ пришли?
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением
iliorik вне форума  
 
Непрочитано 21.06.2024, 17:01
#29
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,069


Цитата:
Сообщение от iliorik Посмотреть сообщение
не так сложно всё
Как и все в программировании. Легко написать программу, которая делает что-нибудь простое. Например, записывает PDF с ИУЛом. Потому что для этого надо реализовать 0.01% от всех возможностей формата. Но если надо прочитать файл, который записал кто-то еще, надо реализовать 100% формата. Программа, записывающая минимальный файл, пишется за день-другой. Программа, читающая произвольный файл - за 10-20 лет.
Цитата:
Сообщение от iliorik Посмотреть сообщение
спарсить можно
Я, когда с техотделом воевал, вручную парсил: в Far Manager открывал, и заменял теги ModifyDate, CreateDate, MetadataDate (примеры этих тегов по ссылке выше есть). Но внутри файла могут лежать пожатые объекты и хз что еще. Парсить упаковку из нескольких форматов сжатия в нуля из принципа - дурная затея. А без этого программа никак не даст гарантии, что она все исправила. Единственное легковесное решение - генерить ИУЛ; как писать тексты и рисовать линии, в учебнике показано. Но потом же туда надо будет фамилии вставлять, или сканы подписей - и пойдет история развития программы годы наматывать.
Нубий-IV вне форума  
 
Автор темы   Непрочитано 21.06.2024, 17:31
#30
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Единственное легковесное решение - генерить ИУЛ; как писать тексты и рисовать линии, в учебнике показано
На интересную мысль вы меня натолкнули. Может стоит liblatex.h использовать? Не, она для формул больше и научных текстов.
Наверное что то попроще есть, в плане того что бы красивые линии и тексты делать в pdf, считывать метаданные pdf разделов проекта и смотреть на титульный лист.
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением

Последний раз редактировалось iliorik, 21.06.2024 в 17:59.
iliorik вне форума  
 
Непрочитано 22.06.2024, 05:08
#31
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,069


Цитата:
Сообщение от iliorik Посмотреть сообщение
красивые линии и тексты делать в pdf
Делать в pdf можно без подготовки, если нужно просто записать файл фиксированного формата с нуля. Там достаточно несколько строк подставить в шаблон:
Код:
[Выделить все]
 
#include <fstream>

void write(std::ofstream &pdf, char const* name)
{
    pdf <<  "%PDF-1.2\n"
            "1 0 obj\n"
            "<<\n"
            "/Type /Page\n"
            "/Parent 5 0 R\n"
            "/Resources 3 0 R\n"
            "/Contents 2 0 R\n"
            ">>\n"
            "endobj\n"
            "2 0 obj\n"
            "<< /Length 51 >>\n"
            "stream\n"
            "BT\n"
            "/F1 24 Tf\n"
            "1 0 0 1 150 200 Tm\n"
            "(" << name << ")Tj\n"
            "ET\n"
            "100 100 m\n"
            "300 100 l\n"
            "300 300 l\n"
            "100 300 l\n"
            "100 100 l\n"
            "s\n"
            "endstream\n"
            "endobj\n"
            "3 0 obj\n"
            "<<\n"
            "/ProcSet[/PDF/Text]\n"
            "/Font <</F1 4 0 R >>\n"
            ">>\n"
            "endobj\n"
            "4 0 obj\n"
            "<<\n"
            "/Type /Font\n"
            "/Subtype /Type1\n"
            "/Name /F1\n"
            "/BaseFont/Helvetica\n"
            ">>\n"
            "endobj\n"
            "5 0 obj\n"
            "<<\n"
            "/Type /Pages\n"
            "/Kids [ 1 0 R ]\n"
            "/Count 1\n"
            "/MediaBox\n"
            "[ 0 0 400 400 ] >>\n"
            "endobj\n"
            "6 0 obj\n"
            "<<\n"
            "/Type /Catalog\n"
            "/Pages 5 0 R\n"
            ">>\n"
            "endobj\n"
            "trailer\n"
            "<<\n"
            "/Root 6 0 R\n"
            ">>";
}

int main()
{
    std::ofstream pdf("iul.pdf");
    write(pdf, "Name");
}
А читать чужое - на несколько лет работы. Потому что файл может взяться откуда попало. Например, из онлайн-сервиса по уменьшению размера файла. И любая часть файла может, например, оказаться сжатой архиватором (в PDF есть встроенная архивация в бинарный поток). И тогда ее не получится "просто распарсить и поменять дату". Откуда программа "по щелчку одной левой", например, возьмет фамилии разработчиков? Или как она проверит, не записан ли уже CRC в иуле? Прочитает из исходного PDF? Примерно так: Почему так сложно извлекать текст из PDF?, Текст любой ценой: PDF. На хабре вообще полезно поискать, что думают программисты про этот формат.
Нубий-IV вне форума  
 
Автор темы   Непрочитано 24.06.2024, 09:18
#32
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Откуда программа "по щелчку одной левой", например, возьмет фамилии разработчиков? Или как она проверит, не записан ли уже CRC в иуле?
Вот поэтому я думаю, что без нейросетей не обойтись. Подключить OCR, и при помощи нейросетей, обучить извлекать из титулов и штампов всю нужную информацию.
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением
iliorik вне форума  
 
Непрочитано 25.06.2024, 04:59
#33
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,069


Следующие темы будут называться:
  • Помогите написать декодер JPEG без внешних библиотек
  • Помогите написать декодер PNG без внешних библиотек
  • Помогите написать декодер TIFF без внешних библиотек
  • Помогите написать декодер Deflate без внешних библиотек
  • Помогите написать декодер Zip без внешних библиотек
  • Помогите написать декодер Fax Group 4 без внешних библиотек
  • Помогите написать декодер Pdf без внешних библиотек
  • Помогите написать OCR без внешних библиотек
  • Помогите написать нейросеть без внешних библиотек
  • Помогите перевести нейросеть на GPU без внешних библиотек
  • Помогите найди миллион-другой образцов ИУЛ для обучения нейросети
Нубий-IV вне форума  
 
Автор темы   Непрочитано 25.06.2024, 09:49
#34
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Следующие темы будут называться:
Согласен, так бы и было. Но это никому не интересно на данном форуме, поэтому таких тем не будет.
Тут только crc32 для ИУЛ думаю обсуждать.
Когда напишу что то работающее по вытягиванию информации из pdf (если напишу, может надоест и брошу всё это), тогда выложу с новой темой. А потом увяжу две программы между собой, и будет счастье.
Пока в части ИУЛ вижу только создание (или редактирование готовых) RTF документов по клику правой кнопкой мышки.
Такая принципиальная концепция моей программы, минимум действий для определённого результата, при этом не должно быть привязок к стороннему ПО (типа Microsoft Word)
Пока задача была кликнуть по файлу и потом через Ctrl+v вставить код CRC32 в нужное поле.
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением
iliorik вне форума  
 
Непрочитано 25.06.2024, 14:45
#35
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


даже если умудритесь написать программу, которая учитывает все организационную "рукожопость" многих проектных организаций - то они (организации) просто начнут еще больше "косячить") Никогда исправление ошибок за других не приводило к уменьшению количества ошибок...
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.06.2024, 15:01
#36
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
даже если умудритесь написать программу, которая учитывает все организационную "рукожопость" многих проектных организаций - то они (организации) просто начнут еще больше "косячить") Никогда исправление ошибок за других не приводило к уменьшению количества ошибок...
Мне вот даже интересно. Если я вижу ошибки, и что должно было быть, может ли нейросеть это тоже увидеть? Мы же как то видим, что что то не так..
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением
iliorik вне форума  
 
Непрочитано 25.06.2024, 16:01
#37
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от iliorik Посмотреть сообщение
Мы же как то видим, что что то не так..
не факт - "правильность" того или иного варианта решения вещь достаточно субъективная:
  1. это может быть "закрепленный" в памяти исполнителя вариант при массовом использовании подобных решений;
  2. может быть навязанный вариант на основании то, что большинство других так делает;
  3. вариант, закрепленный целевым указанием сверху (требованиями НТД или, например, волеизъявлением руководства);
и т.д.
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.06.2024, 16:19
#38
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Ну например, взглянув на титульный лист, мы сразу понимаем где название объекта, где название раздела, где фамилия исполнителя, и где наименование организации (я понимаю что это очень непростая процедура будет в плане нейросетей).
Результат конечно субъективный, но он не отличается от тысячи других субъективных результатов.
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением
iliorik вне форума  
 
Непрочитано 25.06.2024, 16:31
#39
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от iliorik Посмотреть сообщение
мы сразу понимаем где название объекта, где название раздела, где фамилия исполнителя, и где наименование организации
поменяйте поля титульного листа местами и сам текст сделайте на совершенно неизвестном для читающего языке...)
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.06.2024, 16:49
#40
iliorik


 
Регистрация: 03.10.2009
Сообщений: 733


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
поменяйте поля титульного листа местами
Я всё равно пойму где название объекта, а где название раздела. И даже фамилию от названия организации отличу.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
сам текст сделайте на совершенно неизвестном для читающего языке
А такой pdf с разделом документации я отправлю обратно, с вопросом, что это, и как по этому строить в РФ
__________________
Черточки и точки на плоскости - лишь посредник между идеей проекта и его физическим воплощением
iliorik вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Помогите улучшить код получения CRC32 IEEE для ИУЛ (Информационно удостоверяющего листа) для экспертизы, из файла на С++

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск