История изменений
Исправление Toxo2, (текущая версия) :
Пардон. Не мог остановиться. )
Что бы ни делать, лишь бы колодец не рыть. )
Переписал аккуратнее:
#include <stdio.h>
#include <stdlib.h>
#define BUFLEN 16
#define UNPRINTCHAR 32
#define BUFCOUNT 10000
#define OFFSETLEN 16
#define LINELEN (OFFSETLEN + 1 + BUFLEN * 2 + 1 + BUFLEN + 1)
char *hexx = "0123456789abcdef";
void ulltohex(unsigned long long n, char *s)
{
for (int i = 16; i >= 0; i--)
{
s[i] = hexx[n & 0x0f];
n = n >> 4;
}
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Missing agrument.\n");
return 1;
}
FILE *f = fopen(argv[1], "r");
if (f > 0)
{
char *readbuf = malloc(BUFLEN * BUFCOUNT);
if (readbuf != NULL)
{
unsigned long long offset = 0;
static char line[LINELEN + 1];
while (1)
{
size_t b_realread = fread(readbuf, 1, BUFLEN * BUFCOUNT, f);
if (b_realread > 0)
{
for (int c = 0; c < BUFCOUNT; c++)
{
size_t p_local = c * BUFLEN;
char *localbuf = &readbuf[p_local];
int pos_hex = OFFSETLEN + 2;
int pos_sym = OFFSETLEN + 2 + BUFLEN * 2 + 1;
int sum_check = 0;
for (int i = 0; i < BUFLEN; i++)
{
if (b_realread > (i + p_local))
{
line[pos_hex++] = hexx[(localbuf[i] >> 4) & 0xf];
line[pos_hex++] = hexx[localbuf[i] & 0xf];
line[pos_sym++] = (localbuf[i] < UNPRINTCHAR) ? '.' : localbuf[i];
sum_check += localbuf[i];
}
else
{
line[pos_hex++] = line[pos_hex++] = line[pos_sym++] = ' ';
}
}
if (sum_check != 0)
{
ulltohex(offset, line);
line[OFFSETLEN + 1] = line[OFFSETLEN + 1 + BUFLEN * 2 + 1] = ' ';
line[LINELEN] = '\n';
fputs(line, stdout);
}
offset += BUFLEN;
}
}
else
{
break;
}
}
free(readbuf);
}
else
{
printf("Unable to allocate memory\n");
}
fclose(f);
}
else
{
printf("Unable to open file %s\n", argv[1]);
}
return 0;
}
xxd -g 16 ~/binary.dat | grep -v "00000000000000000000000000000000"
И примерно с той же эффективностью.
За исключением варианта с перенаправлением в /dev/null ) Тогда да, тогда для 2GB /dev/sda1 получается 9 секунд, против 1 минуты для xxd|grep ) Если таки писать в консоль - что там 4 минуты, что там 4 минуты в urxvt. И по 13 минут в xfce4-terminal, соответственно.
Хорошо поиграл в вашу игру, ТС, спасибо ).
Исходная версия Toxo2, :
Пардон. Не мог остановиться. )
Что бы ни делать, лишь бы колодец не рыть. )
Переписал аккуратнее:
#include <stdio.h>
#include <stdlib.h>
#define BUFLEN 16
#define UNPRINTCHAR 32
#define BUFCOUNT 10000
#define OFFSETLEN 16
#define LINELEN (OFFSETLEN + 1 + BUFLEN * 2 + 1 + BUFLEN + 1)
char *hexx = "0123456789abcdef";
void ulltohex(unsigned long long n, char *s)
{
for (int i = 16; i >= 0; i--)
{
s[i] = hexx[n & 0x0f];
n = n >> 4;
}
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Missing agrument.\n");
return 1;
}
FILE *f = fopen(argv[1], "r");
if (f > 0)
{
char *readbuf = malloc(BUFLEN * BUFCOUNT);
if (readbuf != NULL)
{
unsigned long long offset = 0;
static char line[LINELEN + 1];
while (1)
{
size_t b_realread = fread(readbuf, 1, BUFLEN * BUFCOUNT, f);
if (b_realread > 0)
{
for (int c = 0; c < BUFCOUNT; c++)
{
size_t p_local = c * BUFLEN;
char *localbuf = &readbuf[p_local];
int pos_hex = OFFSETLEN + 2;
int pos_sym = OFFSETLEN + 2 + BUFLEN * 2 + 1;
int sum_check = 0;
for (int i = 0; i < BUFLEN; i++)
{
if (b_realread > (i + p_local))
{
line[pos_hex++] = hexx[(localbuf[i] >> 4) & 0xf];
line[pos_hex++] = hexx[localbuf[i] & 0xf];
line[pos_sym++] = (localbuf[i] < UNPRINTCHAR) ? '.' : localbuf[i];
sum_check += localbuf[i];
}
else
{
line[pos_hex++] = line[pos_hex++] = line[pos_sym++] = ' ';
}
}
if (sum_check != 0)
{
ulltohex(offset, line);
line[OFFSETLEN + 1] = line[OFFSETLEN + 1 + BUFLEN * 2 + 1] = ' ';
line[LINELEN] = '\n';
fputs(line, stdout);
}
offset += BUFLEN;
}
}
else
{
break;
}
}
free(readbuf);
}
else
{
printf("Unable to allocate memory\n");
}
fclose(f);
}
else
{
printf("Unable to open file %s\n", argv[1]);
}
return 0;
}
xxd -g 16 ~/binary.dat | grep -v "00000000000000000000000000000000"
И примерно с той же эффективностью.
За исключением варианта с перенаправлением в /dev/null ) Тогда да, тогда для 2GB /dev/sda1 получается 9 секунд, против 1 минуты для xxd|grep ) Если таки писать в консоль - что там 4 минуты, что там 4 минуты в urxvt. И по 13 минут в xfce4-terminal, соответственно.
Хорошо поиграл в вашу игру, спасибо ).