[英]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()
開銷 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
循環兩次運行tab
的strlen()
。
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.