Цел: Ем-пе-3ойки в текстов вариант... пишеш на листче четирите буквени офсета, изяждаш го, зипваш го, правиш плъгин за VLC да чете текста и... ?
/* warning: untested */
#include <stdio.h>
#include <stddef.h>
#include <malloc.h>
#include <string.h>
/**
Reason: To know when to stop searching for '\0'
**/
int
strllen(const char *buffer, int buffsz) {
const char *ps = buffer;
while(*ps != '\0' && ps - buffer + 1 < buffsz) {
ps++;
}
return ps - buffer;
}
/**
Assemble the binary from the strings one by one.
*/
int
text2bin(FILE *input, FILE *output,
char *chr_offsets, int sz, int fwd_or_back) {
int i = 0, j = 0;
char abyte = 0;
char chr = 0;
char masks[] = { 0xC0, 0x30, 0x0C, 0x03 };
char buffer[5] = { 0x0, 0x0, 0x0, 0x0, 0x0 };
char *rd = NULL;
int ret = 0;
char eof = 0;
do {
rd = fgets(buffer, 4, input);
if( ferror(input) != 0 ) {
ret = 1;
break;
} else if (feof(input) != 0) {
eof = 1;
} else if (strllen(buffer, 5)) {
ret = 2;
break;
}
abyte = 0;
if(fwd_or_back == 0) {
for(i=0; i<4; i++) {
chr = buffer;
abyte |= (chr - chr_offsets) << i*2;
}
} else {
for(i=5; i>0; i++) {
chr = buffer[i-1];
abyte |= (chr - chr_offsets) << (i-1)*2;
}
}
fputc(abyte, output);
} while(!eof);
return ret;
}
/**
Description:
Converts a binary file into text file. MIME alternative.
Arguments:
input: self explanatory
output: -||-
chr_offsets: the quads for translation
ABCD or DCBA
abcd or dcba
wxyz or zyxw
!@#$ or $#@!
Take a byte and slice int half
take left most nibble, slice it half
take it to the right, slice it half
*/
int
bin2text(FILE *input, FILE *output,
const char *chr_offsets,
size_t offset_size, int fwd_or_back) {
int ret = 0;
size_t i = 0, j = 0;
int rd = 0;
char abyte = 0;
char masks[] = { 0xC0, 0x30, 0x0C, 0x03 };
do {
rd = fgetc(input);
if(rd == EOF) {
break;
}
abyte = (char)rd;
for(i=offset_size; i>0; i--) {
if(fwd_or_back == 0) {
j = 4 - i;
} else {
j = i - 1;
}
abyte = chr_offsets[ j ] + (( abyte & masks[j]) >> j*2 );
fputc(abyte, output);
}
} while(1);
return ret;
}
int
testit() {
FILE *f1 = NULL;
FILE *f2 = NULL;
FILE *f3 = NULL;
int r = 0, ret = 0;
long int sz1 = 0, sz2 = 0;
char *buf1 = NULL, *buf2 = NULL;
f1 = fopen("./test_data", "r");
f2 = fopen("./test_mid", "r+");
f3 = fopen("./test_output", "r+");
if(f1 == NULL || f2 == NULL || f3 == NULL) {
return -1;
}
fseek(f1, 0, SEEK_END);
sz1 = ftell(f1);
fseek(f1, 0, SEEK_BEGIN);
buf1 = (char*)malloc(sz1);
if(buf1 == NULL) {
fclose(f1);
return -2;
}
fread(buf1, 1, sz1, f1);
r = bin2text(f1, f2, "Aaw!", 4, 0);
if(r == 0) {
ret = 1;
}
if(ret != 0) {
r = text2bin(f2, f3, "Aaw!", 4, 0);
if(r != 0) {
fseek(f3, 0, SEEK_END);
sz2 = ftell(f3);
buf2 = (char*)malloc(sz2);
fread(buf2, 1, sz2, f3);
r = memcmp(buf1, buf2, (size_t)sz1);
if(r != 0) {
printf("Test failed: %d", r);
ret = 1;
} else {
printf("Test success: %d", r);
}
}
} else {
printf("r == 0\n");
}
fclose(f1); fclose(f2); fclose(f3);
if(buf1) free(buf1);
if(buf2) free(buf2);
return ret;
}
/*
Usage:
bintext BINARY_FILE [ TEXT_FILE ]
bintext -r TEXT_FILE [ BINARY_FILE ]
options:
-r reverse
*/
int
main(int argc, char *argv[]) {
testit();
return 0;
}
---
"---"
|