簡體   English   中英

如何將十六進制的無符號字符數組打印到文件?

[英]How to print an unsigned char array in hexadecimal to a file?

我實際上正在嘗試以文件的十六進制表示形式fprintf一個unsigned char數組。

為此,我使用以下代碼:

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

int main()
{
    unsigned char tab[...] = "...";

    FILE* Output = NULL;
    Output = fopen("Output.txt", "w+");

    tabLength = sizeof(tab);
    for ( unsigned int i = 0; i < tabLength; i++ )
        fprintf(Output, "%2X", tab[i]);

    fclose(Output);
}

如果是小數組,沒問題,但是隨着它趨向於大數組(在我的例子中為200M元素),它變得更長:(

如果你們中的一些人可以選擇以更快的方式完成這項工作,我將很高興:)

編輯: tabLength = strlen(tab) -> tabLength = sizeof(tab) ;

為了更快地將緩沖區以十六進制形式轉儲到文件中,請使用基於手工編碼的塊的方法:

  • 沒有fprintf()開銷
  • 更少的庫函數調用,相應地,更少的鎖。
  • 寫4K塊(或2的更高冪)以利於頁面對齊,從而有機會進行fwrite繞過緩沖階段。

這是代碼:

#define CHUNK 2048

void dumphex(const unsigned char *a, size_t size, FILE *fp) {
    char buf[CHUNK * 2];
    const char *xdigits = "0123456789ABCDEF";
    size_t i, j;

    for (; size >= CHUNK; size -= CHUNK, a += CHUNK) {
        for (i = j = 0; i < CHUNK; i++, j += 2) {
            unsigned char c = a[i];
            buf[j + 0] = xdigits[c >> 4];
            buf[j + 1] = xdigits[c & 15];
        }
        fwrite(buf, 2, CHUNK, fp);
    }
    for (i = j = 0; i < size; i++, j += 2) {
        unsigned char c = a[i];
        buf[j + 0] = xdigits[c >> 4];
        buf[j + 1] = xdigits[c & 15];
    }
    fwrite(buf, 2, size, fp);
}

代碼通過strlen()調用和for循環兩次運行tabstrlen()

tabLength = strlen(tab); // waste
for ( unsigned int i = 0; i < tabLength; i++ )
    fprintf(Output, "%2X", tab[i]);

而是只運行一次長度。

for ( unsigned int i = 0; tab[i]; i++ )
    fprintf(Output, "%2X", tab[i]);

此外,我認為OP的前提不正確。 使用tabLength = strlen(tab); 查找長度表示unsigned char array是一個字符串 相反,我懷疑可以通過其他方式找到unsigned char array的真實長度。


通常,重復調用fprintf()以打印2個字符最好以16、64、4096等為一組。在這種情況下,以@DYZ為佳 分塊打印到本地緩沖區,然后打印緩沖區。

for (unsigned int i = 0; i < tabLength; i++ )
    fprintf(Output, "%2X", tab[i]);

次要:更典型的共振峰是"%02X" 這取決於您是否想要前導空格或值小於16的0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM