簡體   English   中英

如何在C中將十六進制ASCII值保存到數組(緩沖區)?

[英]How to save hexadecimal ASCII values to array (buffer) in C?

我在輸入中有一個int值,我想將其保存為ASCII的十六進制表示形式的緩沖區/數組。 我知道如何以十六進制格式打印它,但是如何將其保存到緩沖區中呢?

這是我寫的代碼:

int a = 98765;
char buffer[20];
m = sprintf(buffer, "%d", a);

printf("ASCII value in hex: ");
for(int i=0; buffer[i]!='\0'; i++)
{
    printf("%02X", buffer[i]);
}

例如如果a = 123我想得到313233

第一個sprintf為您提供了一個char數組,其中每個char的范圍都是0x30到0x39。 您希望將它們擴展為兩個字符“ 3”和“ 0”,“ 3”和“ 1”等。

您正在將源中的每個字符擴展為輸出中的兩個字符,這意味着您不能將相同的目標緩沖區用作源緩沖區-您在處理它們之前會覆蓋源緩沖區中的值。 如果需要將結果放入buffer則可能需要將第一個sprintf放入一個單獨的char數組中。 在你的循環中,改變printfsprintf到索引buffer ,由兩個每個循環遞增索引。 (因為這是兩個原因,所以您將用第二個迭代的sprintf輸出覆蓋第一個迭代的字符串終止符,其中將包括一個新的字符串終止符。循環的最后一個迭代中的sprintf將為您終止字符串。)

您沒有提到應該處理的最長輸入,也沒有提及選擇數組長度的原因。 如果您接受對於緩沖區來說太長的輸入,這里就有緩沖區溢出的危險(並且不要忘記考慮最后一個字符之后的空終止的空間。)

您已經使用sprintf將十進制值表示為字符串。 您可以對十六進制格式執行相同的操作。

使用sprintf()的返回值(即“已打印”的字符數)將索引前進到緩沖區中,作為下一個十六進制對的目標,然后迭代十進制buffer中的每個字符。

請注意,您可以使用第一個sprintf()的返回值( m sprintf()進行迭代,而不是測試nul。

char hexbuffer[64];
int index = 0 ;
for(int i = 0; i < m; i++)
{
    index += sprintf( &hexbuffer[index], "%02X", buffer[i] ) ;
}

當然,如果輸入僅包含十進制數字(即用戶未輸入導致在buffer[0]處出現-的負值buffer[0] ,則只需在每個十進制數字前插入3即可,因此:

char hexbuffer[64];
for(int i = 0; i < m; i++)
{
    bexbuffer[i * 2] = '3' ;
    hexbuffer[i * 2 + 1] = buffer[i] 
}

如果只有小數位數的用意,你應該改變的類型, aunsigned ,並使用%u格式說明為十進制輸入。

暫無
暫無

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

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