Add files via upload

This commit is contained in:
MihailRis
2021-04-25 16:08:48 +03:00
committed by GitHub
commit e1cdcf01e9
49 changed files with 2866 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
#include "files.h"
#include <fstream>
#include <iostream>
bool write_binary_file_part(std::string filename, const char* data, size_t offset, size_t size){
std::ofstream output(filename, std::ios::out | std::ios::binary | std::ios::in);
if (!output.is_open())
return false;
output.seekp(offset);
output.write(data, size);
return true;
}
bool write_binary_file(std::string filename, const char* data, size_t size) {
std::ofstream output(filename, std::ios::binary);
if (!output.is_open())
return false;
output.write(data, size);
output.close();
return true;
}
unsigned int append_binary_file(std::string filename, const char* data, size_t size) {
std::ofstream output(filename, std::ios::binary | std::ios::app);
if (!output.is_open())
return 0;
unsigned int position = output.tellp();
output.write(data, size);
output.close();
return position;
}
bool read_binary_file(std::string filename, char* data, size_t size) {
std::ifstream output(filename, std::ios::binary);
if (!output.is_open())
return false;
output.read(data, size);
output.close();
return true;
}
bool read_binary_file(std::string filename, char* data, size_t offset, size_t size) {
std::ifstream input(filename, std::ios::binary);
if (!input.is_open())
return false;
input.seekg(offset);
input.read(data, size);
input.close();
return true;
}
// returns decompressed length
unsigned int decompressRLE(const char* src, unsigned int length, char* dst, unsigned int targetLength){
unsigned int offset = 0;
for (unsigned int i = 0; i < length;){
unsigned char counter = src[i++];
char c = src[i++];
for (unsigned int j = 0; j <= counter; j++){
dst[offset++] = c;
}
}
return offset;
}
unsigned int calcRLE(const char* src, unsigned int length) {
unsigned int offset = 0;
unsigned int counter = 1;
char c = src[0];
for (unsigned int i = 0; i < length; i++){
char cnext = src[i];
if (cnext != c || counter == 256){
offset += 2;
c = cnext;
counter = 0;
}
counter++;
}
return offset + 2;
}
// max result size = length * 2; returns compressed length
unsigned int compressRLE(const char* src, unsigned int length, char* dst) {
unsigned int offset = 0;
unsigned int counter = 1;
char c = src[0];
for (unsigned int i = 1; i < length; i++){
char cnext = src[i];
if (cnext != c || counter == 256){
dst[offset++] = counter-1;
dst[offset++] = c;
c = cnext;
counter = 0;
}
counter++;
}
dst[offset++] = counter-1;
dst[offset++] = c;
return offset;
}