LINUX.ORG.RU

История изменений

Исправление 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, соответственно.

Хорошо поиграл в вашу игру, спасибо ).