1

(14 552 відповідей, залишених у Інше)

то куди пан даташенко дівся?

2

(14 552 відповідей, залишених у Інше)

FakiNyan написав:
Kane 2.0 написав:

Так.

а якщо в мене в приват24 лишень гривневі валети, а той чувак гроші в долярах перешле, то що буде?

Конвертація, щодо поточного курсу.

3

(14 552 відповідей, залишених у Інше)

FakiNyan написав:

чуєте, от на картці приватбанку написано VISA, то це будь-який дядько з іншої країни може присилати мені гроші, якщо буде знати лишень номер цієї картки?

Так.

4

(14 552 відповідей, залишених у Інше)

Без розбору усім присилають, розраховують, що може хто й прилипне.
Оце я трохи не второпаю, а що з тими, кому вже виповнилося 27 і він не служив? Ставлять у запас?

5

(198 відповідей, залишених у Системне програмування)

Буває ще на фоні якоїсь неприязні (конкуренція), або ж софт відверте лайно. Тим паче це рушій прогресу для автора і він скоріше оновить програму ...або закриється)

Прихований текст

Ну й просто гарний привід про себе заявити спільноті.. чи ні? Да усі "привати", того ж вищевказаного факаву, на половину заповнені подібними похеками ті іншими "утєчкамі" :D
Чергова двояка ситуація. В наших реаліях і сучасному розумінні публічного "андеграунду" - більше шкоди вийде, аніж добра та репутації.

6

(11 відповідей, залишених у Python)

FakiNyan, це було зроблено. Брав min/max значення по x та y, потім по цим значенням формував прямокутник, та в циклі порівнював координати миші в межах цього прямокутника. Нічого кращого до розуму не прийшло.

Хіх, забув додати: цей полігон, при кожному кліку, я закрашую, і саме тому краї полігона мені здалися карявими та негарними у растрі. Свій растр я конвертнув у SVG, та при виводі на форму його штучно збільшував до потрібного мені розміру. Звісно, полігон по новим координатам буде в оригінальному розмірі, тобто мені його теж треба масштабувати, як - хз. Ну і щодо самих координат: аби краї полігона були симпатичні, то бажано використовувати координати в оригінальному кодуванні, бо воно там відповідає стандарту цього SVG, але для спрощення задавання координат через QPoint, я використав самопальну утиліту InkscapeMap, звісно воно різало цінний контент цих координат (в оригіналі, наприклад, якась точка має 14.88, а программа мені урізає його до просто 14).

Яким толерантним способом усе це зробити у pyqt?

7

(11 відповідей, залишених у Python)

Значить в html є такий собі атрибут "usemap", він дозволяє вказати, що певна ділянка зображення є посиланням. Задавши координати, ми можемо формувати доволі складні фігури.
Так життя склалося, що мені випало зробити подібне у pyqt. За пару годин накидав концепт, де мені підвантажувалося зображення (QPixmap), попередньо я вручну отримав бажані координати у inkscape із цього зображення, ну а там вже збочення із малюванням полігона (QPolygon) по тим координатам. Усе працює, але так як зображення растрове, то краї полігона каряві та негарні. Ніби не критично, але я запримітив, що гарніше буде у векторі, а точніше svg. Значить якось перевів картинку у svg, вивів на форму через QSvgRenderer, а далі хз.. яким способом можна імітувати роботу usemap нативно? Або може хто знає ще які-небудь методи вирішення подібної задачі?

8

(198 відповідей, залишених у Системне програмування)

І ще, питаннячко до пізнавших дзен системщини: чи етично хачити софт СНГ-виробника і кидати до пабліку?

9

(198 відповідей, залишених у Системне програмування)

Генератор сміттєвих іконок.

Переглядаючи семпли різної малварі, іноді доводиться бачити файли з абсолютно нехитрою іконкою - піксельний рандом з прозорими областями. Таке часто використовується у файлах призначених для прогрузу, просто й ефектно. На черговому файлі, захотілося подібне реалізувати, що і було зроблено. Заодно стала зрозумілою структура * .ico.
Отже:

icogen.h

#ifndef ICOGEN_H
#define ICOGEN_H

#include <windows.h>

#define SystemFunction036 NTAPI SystemFunction036
#include <NTSecAPI.h>
#undef SystemFunction036

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


typedef struct _ICONDIRENTRY {
    BYTE bWidth;
    BYTE bHeight;
    BYTE bColorCount;
    BYTE bReserved;
    WORD wPlanes;
    WORD wBitCount;
    DWORD dwBytesInRes;
    DWORD dwImageOffset;
} ICONDIRENTRY, *PICONDIRENTRY;

typedef struct _ICONDIR {
    WORD idReserved;
    WORD idType;
    WORD idCount;
    PICONDIRENTRY idEntries;
} ICONDIR, *PICONDIR;

typedef struct _ICONIMAGE {
    BITMAPINFOHEADER icHeader;
    RGBQUAD *icColors;
    BYTE *icMask;
} ICONIMAGE, *PICONIMAGE;


typedef struct _ICON {
    FILE *hFile;
    ICONDIR IconDir;
    PICONIMAGE pIconImage;
} ICON, *PICON;


/*
    szFileName - файл иконки
    aIcoSize - массив с требуемыми размерами иконок (min - 1x1, max - 256x256)
    uIcoCount - кол-во элементов (иконок) в массиве
    uIcoColor - кол-во используемых цветов
    bTransp - прозрачность (от 0 до 255)

    return: 0 - успех; -1 - ошибка
*/
int WINAPI icogen_create_ico(const char *szFileName, const uint32_t aIcoSize[], const size_t uIcoCount, const uint32_t uIcoColor, const uint8_t bTransp);

#endif

icogen.c

#include "icogen.h"

ULONG icogen_rnd(const uint32_t uMin, const uint32_t uMax)
{
    ULONG lRnd;

    return RtlGenRandom(&lRnd, sizeof(ULONG)) ? (uMin <= uMax ? lRnd % (uMax - uMin + 1) + uMin : -1) : -1;
}


int icogen_size_is_ok(const uint32_t aIcoSize[], const size_t uIcoCount) {
    for (size_t i = 0; i < uIcoCount; i++) {
        if (aIcoSize[i] < 1 || aIcoSize[i] > 256)
            return -1;
    }

    return 0;
}


#define get_mask_size(bit) (((bit)+31)/32*4*(bit))


PICON icogen_init(const char *szFileName, const uint32_t aIcoSize[], const size_t uIcoCount, const uint32_t uIcoColor)
{
    if (!icogen_size_is_ok(aIcoSize, uIcoCount) && uIcoCount >= 1 && uIcoColor >= 1) {
        PICON pIcon = NULL;

        if (pIcon = calloc(1, sizeof(ICON))) {
            if (pIcon->hFile = fopen(szFileName, "wb")) {
                if (pIcon->IconDir.idEntries = calloc(uIcoCount, sizeof(ICONDIRENTRY))) {
                    if (pIcon->pIconImage = calloc(uIcoCount, sizeof(ICONIMAGE))) {
                        for (size_t i = 0; i < uIcoCount; i++) {
                            if (!(pIcon->pIconImage[i].icColors = calloc(aIcoSize[i] * aIcoSize[i], sizeof(RGBQUAD))))
                                return NULL;

                            if (!(pIcon->pIconImage[i].icMask = calloc(1, get_mask_size(aIcoSize[i]))))
                                return NULL;
                        }

                        return pIcon;
                    }
                }
            }
        }
    }

    return NULL;
}


void icogen_clear(PICON pIcon, const size_t uIcoCount)
{
    for (size_t i = 0; i < uIcoCount; i++) {
        if (pIcon->pIconImage[i].icMask)
            free(pIcon->pIconImage[i].icMask);

        if (pIcon->pIconImage[i].icColors)
            free(pIcon->pIconImage[i].icColors);
    }

    if (pIcon->pIconImage)
        free(pIcon->pIconImage);

    if (pIcon->IconDir.idEntries)
        free(pIcon->IconDir.idEntries);

    fclose(pIcon->hFile);

    if (pIcon)
        free(pIcon);
}


void icogen_write(PICON pIcon, const uint32_t aIcoSize[], const size_t uIcoCount)
{
    // icondir
    fwrite(&pIcon->IconDir.idReserved, sizeof(pIcon->IconDir.idReserved), 1, pIcon->hFile);
    fwrite(&pIcon->IconDir.idType, sizeof(pIcon->IconDir.idType), 1, pIcon->hFile);
    fwrite(&pIcon->IconDir.idCount, sizeof(pIcon->IconDir.idCount), 1, pIcon->hFile);

    fwrite(pIcon->IconDir.idEntries, sizeof(ICONDIRENTRY), uIcoCount, pIcon->hFile);

    for (size_t i = 0; i < uIcoCount; i++) {
        // header
        fwrite(&pIcon->pIconImage[i].icHeader, sizeof(pIcon->pIconImage[i].icHeader), 1, pIcon->hFile);

        // rgb
        fwrite(pIcon->pIconImage[i].icColors, sizeof(RGBQUAD), aIcoSize[i] * aIcoSize[i], pIcon->hFile);

        // mask
        fwrite(pIcon->pIconImage[i].icMask, get_mask_size(aIcoSize[i]), 1, pIcon->hFile);
    }
}


int WINAPI icogen_create_ico(const char *szFileName, const uint32_t aIcoSize[], const size_t uIcoCount, const uint32_t uIcoColor, const uint8_t bTransp)
{
    PICON pIcon = NULL;

    if (pIcon = icogen_init(szFileName, aIcoSize, uIcoCount, uIcoColor)) {
        DWORD dwImageOffsetPrev = uIcoCount * sizeof(ICONDIRENTRY) + sizeof(WORD) * 3;

        pIcon->IconDir.idReserved = 0;
        pIcon->IconDir.idType = 1;
        pIcon->IconDir.idCount = (WORD)uIcoCount;

        for (size_t i = 0; i < uIcoCount; i++) {
            pIcon->IconDir.idEntries[i].bWidth = aIcoSize[i];
            pIcon->IconDir.idEntries[i].bHeight = aIcoSize[i];
            pIcon->IconDir.idEntries[i].bColorCount = 0;
            pIcon->IconDir.idEntries[i].bReserved = 0;
            pIcon->IconDir.idEntries[i].wPlanes = 1;
            pIcon->IconDir.idEntries[i].wBitCount = 32;
            pIcon->IconDir.idEntries[i].dwBytesInRes = sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD) * aIcoSize[i] * aIcoSize[i]) + get_mask_size(aIcoSize[i]);
            pIcon->IconDir.idEntries[i].dwImageOffset = dwImageOffsetPrev;

            pIcon->pIconImage[i].icHeader.biSize = sizeof(BITMAPINFOHEADER);
            pIcon->pIconImage[i].icHeader.biWidth = aIcoSize[i];
            pIcon->pIconImage[i].icHeader.biHeight = 2 * aIcoSize[i];
            pIcon->pIconImage[i].icHeader.biPlanes = 1;
            pIcon->pIconImage[i].icHeader.biBitCount = 32;
            pIcon->pIconImage[i].icHeader.biCompression = 0;
            pIcon->pIconImage[i].icHeader.biSizeImage = 0;
            pIcon->pIconImage[i].icHeader.biXPelsPerMeter = 0;
            pIcon->pIconImage[i].icHeader.biYPelsPerMeter = 0;
            pIcon->pIconImage[i].icHeader.biClrUsed = 0;
            pIcon->pIconImage[i].icHeader.biClrImportant = 0;

            RGBQUAD *rgb = calloc(uIcoColor, sizeof(RGBQUAD));
            memset(rgb, bTransp, uIcoColor * sizeof(RGBQUAD));

            uint32_t jmp = 0;

            for (size_t j = 0; j < aIcoSize[i] * aIcoSize[i]; j++) {
                if (!(j % (aIcoSize[i] * aIcoSize[i] / icogen_rnd(1, aIcoSize[i])))) {
                    for (size_t k = 0; k < uIcoColor; k++) {
                        RtlGenRandom(rgb + k, 3);
                    }

                    jmp = jmp ? 0 : 1;
                }

                if (icogen_rnd(jmp, 1)) {
                    pIcon->pIconImage[i].icColors[j] = rgb[icogen_rnd(0, uIcoColor - 1)];
                }
            }

            if (rgb)
                free(rgb);

            RtlGenRandom(pIcon->pIconImage[i].icMask, get_mask_size(aIcoSize[i]));

            dwImageOffsetPrev += pIcon->IconDir.idEntries[i].dwBytesInRes;
        }

        icogen_write(pIcon, aIcoSize, uIcoCount);
        icogen_clear(pIcon, uIcoCount);

        return 0;
    }

    return -1;
}

main.c

#include "icogen.h"

int main(int argc, char **argv)
{
    const uint32_t ico[] = { 16, 24, 32, 48, 128, 256 };

    if (!icogen_create_ico("icon.ico", ico, sizeof(ico) / sizeof(ico[0]), 2, 255)) {
        printf("Successfully completed!\n");
    } else {
        printf("Error!\n");
    }

    return 0;
}

Використання на fasm:

    format pe console 5.01


    section '.text' import readable executable

    include 'win32a.inc'

    library icogen_dll, 'icogen_dll.dll',\
            kernel32, 'kernel32.dll',\
            msvcrt, 'msvcrt.dll'


    import  icogen_dll,\
            icogen_create_ico, 'icogen_create_ico'

    import  kernel32,\
            ExitProcess, 'ExitProcess'

    import  msvcrt,\
            printf, 'printf'


entry $

    invoke icogen_create_ico, fname, ico, ico_sz, 2, 255
    test eax, eax
    jne .e
    cinvoke printf, s
    jmp .s
.e: cinvoke printf, e
.s: invoke ExitProcess, 0


    ico         dd 16, 24, 32, 48, 128, 256
    ico_sz      = ($ - ico) / 4

    fname       db 'icon.ico', 0

    s           db 'Successfully completed!', 13, 10, 0
    e           db 'Error!', 13, 10, 0

на Python:

#!/usr/bin/env py -3

import ctypes
import struct

icogen_dll = ctypes.windll.LoadLibrary('icogen_dll.dll')

sz = 16, 24, 32, 48, 128, 256

if not icogen_dll.icogen_create_ico(b'icon.ico', struct.pack(str(len(sz)) + 'I', *sz), len(sz), 2, 255):
    print("Successfully completed!\n")
else:
    print("Error!\n")

10

(198 відповідей, залишених у Системне програмування)

Рекурсивний пошук файлів. Виконує рекурсивний пошук по розширенню і назві файлу на зовнішніх/зйомних/мережевих носіях, використовує єдиний буфер. Також містить можливість виключення директорій для пошуку (windows/program files та ін.). В якості критики, було зазначено, що бажано використовувати unicode-шляхи замість зазначених тут ascii (MAX_PATH).

#include <windows.h>
#include <Shlwapi.h>

#include <stdio.h>
#include <stdbool.h>


// ---------------------------------------------------------------------------------------

// папки в которых исключено сканирование
static const char *dir[] = {
    "windows",
    "program files",
    "program files (x86)",
    "system volume information"
};

// файлы для поиска
static const char *fil[] = {
    "Visual Studio 2015.lnk",
    "Sublime Text 3.lnk",
    "start.bat",
    "Программируем Raspberry Pi на голом железе _ Хабрахабр.htm"
};

// расширения, по которым нужно искать
static const char *ext[] = {
    ".rar",
    ".zip",
    ".mp3",
    ""          // файлы без расширения
};

// ---------------------------------------------------------------------------------------

typedef enum _dir_fil_ext {
    E_DIR = 0,
    E_FIL,
    E_EXT
} dir_fil_ext;

#define arr_sz(a) (sizeof(a) / sizeof(a[0]))

bool check(char *dst, dir_fil_ext dfe)
{
    const char **src;
    size_t n;

    switch (dfe) {
        case E_DIR:
            src = dir;
            n = arr_sz(dir);
            break;

        case E_FIL:
            src = fil;
            n = arr_sz(fil);
            break;

        case E_EXT:
            src = ext;
            n = arr_sz(ext);
            break;
    }

    for (size_t i = 0; i < n; i++)
        if (/*!lstrcmpiA(dst, src[i])*/ CompareStringA(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, dst, -1, src[i], -1) == CSTR_EQUAL)
            return true;

    return false;
}

// ---------------------------------------------------------------------------------------

void get_file(char *szPath)
{
    WIN32_FIND_DATAA sWin32FindData;

    int iPath = lstrlenA(szPath);
    lstrcatA(szPath, "*.*");

    HANDLE hFindFile = FindFirstFileA(szPath, &sWin32FindData);

    if (hFindFile != INVALID_HANDLE_VALUE) {
        do {
            if (!lstrcmpA(sWin32FindData.cFileName, ".") || !lstrcmpA(sWin32FindData.cFileName, ".."))
                continue;

            szPath[iPath] = '\0';
            lstrcatA(szPath, sWin32FindData.cFileName);

            if (sWin32FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                if (!check(sWin32FindData.cFileName, E_DIR)) {
                    lstrcatA(szPath, "\\");
                    get_file(szPath);
                }
            } else {
                if (check(sWin32FindData.cFileName, E_FIL) || check(PathFindExtensionA(sWin32FindData.cFileName), E_EXT)) {
                    printf("%s\n", szPath);
                }
            }
        } while (FindNextFileA(hFindFile, &sWin32FindData));

        FindClose(hFindFile);
    }
}

void get_drive()
{
    DWORD dwDrives = GetLogicalDrives();

    for (char szPath[MAX_PATH + 1] = "A:\\"; dwDrives; dwDrives >>= 1, szPath[0]++) {
        if (dwDrives & 1) {
            UINT dwType = GetDriveTypeA(szPath);

            if (dwType == DRIVE_REMOVABLE || dwType == DRIVE_FIXED || dwType == DRIVE_REMOTE) {
                get_file(szPath);
                szPath[3] = '\0';

                putchar('\n');
            }
        }
    }
}


int main(void)
{
    get_drive();

    return 0;
}

11

(198 відповідей, залишених у Системне програмування)

Був розмістив на факаві, та як мені стало зрозуміло, подібне там мало хто по суті може оцінити. Взагалі, форум із скріпткідді.
І так, Hex dump. Підтримує паддинг, встановлення ширини слова/загальної ширини, колонку ASCII (0x20 - 0x7F та 0xC0 - 0xFF).

0012FE40 | 00 01 02 03  04 05 06 07  08 09 0A 0B  0C 0D 0E 0F | ................ |
0012FE50 | 10 11 12 13  14 15 16 17  18 19 1A 1B  1C 1D 1E 1F | ................ |
0012FE60 | 20 21 22 23  24 25 26 27  28 29 2A 2B  2C 2D 2E 2F |  !"#$%&'()*+,-./ |
0012FE70 | 30 31 32 33  34 35 36 37  38 39 3A 3B  3C 3D 3E 3F | 0123456789:;<=>? |
0012FE80 | 40 41 42 43  44 45 46 47  48 49 4A 4B  4C 4D 4E 4F | @ABCDEFGHIJKLMNO |
0012FE90 | 50 51 52 53  54 55 56 57  58 59 5A 5B  5C 5D 5E 5F | PQRSTUVWXYZ[\]^_ |
0012FEA0 | 60 61 62 63  64 65 66 67  68 69 6A 6B  6C 6D 6E 6F | `abcdefghijklmno |
0012FEB0 | 70 71 72 73  74 75 76 77  78 79 7A 7B  7C 7D 7E 7F | pqrstuvwxyz{|}~  |
0012FEC0 | 80 81 82 83  84 85 86 87  88 89 8A 8B  8C 8D 8E 8F | ................ |
0012FED0 | 90 91 92 93  94 95 96 97  98 99 9A 9B  9C 9D 9E 9F | ................ |
0012FEE0 | A0 A1 A2 A3  A4 A5 A6 A7  A8 A9 AA AB  AC AD AE AF | ................ |
0012FEF0 | B0 B1 B2 B3  B4 B5 B6 B7  B8 B9 BA BB  BC BD BE BF | ................ |
0012FF00 | C0 C1 C2 C3  C4 C5 C6 C7  C8 C9 CA CB  CC CD CE CF | АБВГДЕЖЗИЙКЛМНОП |
0012FF10 | D0 D1 D2 D3  D4 D5 D6 D7  D8 D9 DA DB  DC DD DE DF | РСТУФХЦЧШЩЪЫЬЭЮЯ |
0012FF20 | E0 E1 E2 E3  E4 E5 E6 E7  E8 E9 EA EB  EC ED EE EF | абвгдежзийклмноп |
0012FF30 | F0 F1 F2 F3  F4 F5 F6 F7  F8 F9 FA FB  FC FD FE FF | рстуфхцчшщъыьэюя |

Ф-я:

typedef enum _word_size {
    WORD_4_BYTE = 4,
    WORD_8_BYTE = 8
} word_size;

typedef enum _dump_width {
    WIDTH_4 = 4,
    WIDTH_8 = 8,
    WIDTH_16 = 16,
    WIDTH_32 = 32
} dump_width;


#define c_r(n, a, b) (((n) >= (a)) && ((n) <= (b)))

/*
    word:   размер слова (WORD_4_BYTE, WORD_8_BYTE)
    width:  ширина дампа в байтах (WIDTH_4, WIDTH_8, WIDTH_16, WIDTH_32)
    no_col: true - сплошные байты, false - разделять по размеру слова
    buf:    буфер
    num:    размер буфера
*/
void hex_dump(const word_size word, const dump_width width, bool no_col, void *const buf, const size_t num)
{
    if (width >= word && !(width % word) && c_r(width, WIDTH_4, WIDTH_32) && buf && num > 0) {
        const uint32_t pad = width - ((num - 1) % width) + num - 1;

        for (size_t i = 0; i < pad; i++) {
            if (!(i % width))
                printf("%08X | ", (uint32_t)buf + i);

            if (i < num)
                printf("%02X", ((uint8_t *)buf)[i]);
            else
                printf("--");

            printf((i + 1) % (width / (no_col ? 1 : width / word)) ? " " : ((i + 1) % width ? "  " : " | "));

            if (!((i + 1) % width) || i + 1 == pad) {
                for (size_t j = i + 1 - width; j < i + 1 ? true : (printf(" |\n"), false); j++) {
                    if (j < num) {
                        uint8_t c = ((uint8_t *)buf)[j];
                        putchar(c_r(c, 0x20, 0x7F) || c_r(c, 0xC0, 0xFF) ? c : '.');
                    } else {
                        putchar('.');
                    }
                }
            }
        }

        putchar('\n');
    } else {
        printf("hex_dump error!\n");
        exit(1);
    }
}

Код..

    char *s = "test string, тестовая сТрОкА, 1234567890";
    hex_dump(WORD_4_BYTE, WIDTH_16, false, s, strlen(s) + sizeof((char)'\n'));

..покаже наступним чином:

00409000 | 74 65 73 74  20 73 74 72  69 6E 67 2C  20 F2 E5 F1 | test string, тес |
00409010 | F2 EE E2 E0  FF 20 F1 D2  F0 CE EA C0  2C 20 31 32 | товая сТрОкА, 12 |
00409020 | 33 34 35 36  37 38 39 30  00 -- -- --  -- -- -- -- | 34567890........ |

12

(198 відповідей, залишених у Системне програмування)

Розрахунок crc32 для файлів.

#include <windows.h>

typedef DWORD (__stdcall *_RtlComputeCrc32)(DWORD, const BYTE*, INT);

#define CRC32_BLOCK_SIZE 1024


DWORD get_crc32_of_file(LPCSTR sFileName)
{
    _RtlComputeCrc32 RtlComputeCrc32 = (_RtlComputeCrc32)GetProcAddress(LoadLibraryA("ntdll.dll"), "RtlComputeCrc32");

    HANDLE hFile = CreateFileA(sFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile != INVALID_HANDLE_VALUE) {
        BYTE aBuf[CRC32_BLOCK_SIZE];
        DWORD dwCrc32 = 0, dwBytesRead;

        while (ReadFile(hFile, aBuf, CRC32_BLOCK_SIZE, &dwBytesRead, NULL) && dwBytesRead != 0) {
            dwCrc32 = RtlComputeCrc32(dwCrc32, aBuf, dwBytesRead);
        }

        CloseHandle(hFile);

        return dwCrc32;
    }

    return -1;
}


void entry()
{
    char *aFiles[] = {"test_1.txt", "test_2.txt", "test_3.txt"};

    for (size_t i = 0; i < sizeof(aFiles) / sizeof(aFiles[0]); i++) {
        char aBuf[MAX_PATH + 20];
        wsprintfA(aBuf, "%s = %08X", aFiles[i], get_crc32_of_file(aFiles[i]));
        OutputDebugStringA(aBuf);
    }

    ExitProcess(0);
}

13

(11 відповідей, залишених у C++)

Динамічно думав, та не придумав, бо вирішив, що у цьому немає сенсу (для файлів великих розмірів суттєвого приросту швидкості роботи не видно). А як динамічно? Ділити на константу в залежності від розміру?

14

(11 відповідей, залишених у C++)

А я от щось по типу hashtab робив, встало питання - як бути із великими файлами. crc32, файл 1 гб., з розміром буферу 1 мб. - за 4 сек. рахувало, 1024 кб. - 10 сек.. Файл більше 1-го гб. - однаково, що 1024, що 1024*1024. Хз який тут компроміс виставити.

По швидкості, кажуть, мапінг швидше за все буде, ще правда не перевіряв.. але тут обмеження за розміром файлів виникає..

15

(11 відповідей, залишених у C++)

0xDADA11C7 написав:

Геші робляться шматками через довжину тимчасового бухверу

Якими шматками, за розміром, краще різати?