簡體   English   中英

在控制台中打印十六進制數組

[英]Printing a hex array in console

我有一個uint8_t類型的數組,尺寸為4x4,我使用嵌套的for循環顯示數組,十六進制值通過sprintf()轉換為十六進制字符串。

void hexD(uint8_t state[4][4])
{
char x[2];
for(int i = 0; i < 4; i++)
{
    cout << "\n";
    for(int  j = 0; j < 4; j++)
    {
        cout << j <<"\n"; //displays the value of j
        sprintf(x, "%x", state[i][j]);
        cout << x << "\t";
    }
}
}

問題是for循環內部不斷循環運行,因為j的值從0開始,然后從1開始,然后到2,但不是回到3,而是回到1,j在1和2之間交換,因此循環無限運行。

任何解決方案。

謝謝。

您的x只有兩個空格,但是您正在向其中寫入更多字符。 例如,十六進制的0"00" ,兩個字符加一個結束'\\0'
那會覆蓋相鄰的內存,而您的j恰好在那里並被覆蓋。

增加x[]的大小,它應該可以工作。

取決於您在state[4][4] ,您很可能最終會溢出x數組(請記住,您需要一個最多FF (2個字符)+1的位置作為終止'\\0' )。 那是未定義的行為。 修復它( char x[3]; ),就可以了。 這是一個mcve

#include <iostream>
#include <cstdint>
#include <cstdio>
using namespace std;
void hexD(uint8_t state[4][4])
{
char x[3];
for(int i = 0; i < 4; i++)
{
    cout << "\n";
    for(int  j = 0; j < 4; j++)
    {
        cout << j <<"\n"; //displays the value of j
        sprintf(x, "%x", state[i][j]);
        cout << x << "\t";
    }
}
}
uint8_t state[4][4]={
    255,255,255,255,
    0, 1, 2, 3,
    0, 1, 2, 3,
    0, 1, 2, 3,
};
int main()
{
    hexD(state);
}
char x[2];

您的“十六進制輸出”只有兩個字節,但沒有可用空間用於null字符。

向容量較小的數組中寫入更多內容是未定義的行為

x數組大小增加到3:

char x[3];

由於根據sprintf

內容后面會自動附加一個終止的空字符。

因此,總共有三個字符, 包括 null字符。

暫無
暫無

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

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