我想寫一個hexdump函數。因此,我想用sprintf與格式字符串像如何使用變量或重複數量的佔位符在C中構造格式字符串?
"%c %c %c %c 0x%02X 0x%02X 0x%02X 0x%02X"
,然後用這個字符串在printf的字符(或字節)()。
但是,我希望用戶指定行寬,即每行上要轉儲的字節數。
如何構建具有給定的寬度,即2所導致的"%c %c 0x%02X 0x%02X"
格式字符串的寬度格式字符串...
我想寫一個hexdump函數。因此,我想用sprintf與格式字符串像如何使用變量或重複數量的佔位符在C中構造格式字符串?
"%c %c %c %c 0x%02X 0x%02X 0x%02X 0x%02X"
,然後用這個字符串在printf的字符(或字節)()。
但是,我希望用戶指定行寬,即每行上要轉儲的字節數。
如何構建具有給定的寬度,即2所導致的"%c %c 0x%02X 0x%02X"
格式字符串的寬度格式字符串...
不建立使用sprintf()
只用printf()
以後使用的格式字符串,請考慮以下的方法是(基本上)在輸入字符串兩遍:
void hex_dump(char *bytes, size_t bytes_len)
{
const int DUMP_WIDTH = 16;
for (int i = 0; i < bytes_len; i += DUMP_WIDTH)
{
for (int j = 0; j < DUMP_WIDTH; ++j)
{
if (i + j >= bytes_len) {
printf(" ");
continue;
}
char ch = bytes[i + j];
if (isprint(ch))
{
printf("%c", ch);
}
else
{
printf(".");
}
}
printf(" ");
for (int j = 0; j < DUMP_WIDTH && i + j < bytes_len; ++j)
{
printf("0x%02x", bytes[i + j]);
printf(" ");
}
printf("\n");
}
}
函數將輸出hexdump
樣輸出由DUMP_WIDTH
恆定控制。此外,輸出正確對齊。
我建議這樣做:
我建議這樣做:
void writeIntegersAsChar(char* str, int* source, int N)
{
int i;
for(i = 0; i < N; i ++)
{
sprintf(str + i, "%c", source[i]);
}
}
這可以使用一些豐富的,我同意一次只做1個是最簡單的方法,但是你可以使用'fprintf()'也使用'isprint(c)'之類的東西? c:'。'是個好主意。 –
構建這樣的格式字符串相當容易。
但是,問題是使用該格式調用sprintf。在<stdio.h>
中沒有函數可以讓你傳遞參數的數組。標準C中的每個單獨的printf
變體都要求您在編譯時決定參數的。
雖然有可能在少參數傳遞,它不能幫助你與聯合六角顯示如
"%c %c %c %c 0x%02X 0x%02X 0x%02X 0x%02X"
並很快得到相當繁瑣。
不幸的是,有沒有簡單的出路 - 要麼你需要編寫自己的sprintf變種,或使用循環代替。
選擇一種語言,C和C++是具有類似syntex的不同語言。 – Sma
我只限於C,謝謝@Sma。 – Shuzheng
@Sma我不認爲這是一個有效的反對意見。 OP希望使用'sprintf()',這是一種兩種語言都相同的函數; C++只是用名稱空間和其他必需的小改動導入C頭文件。 –