簡體   English   中英

打印未簽名的字符(十六進制太長)

[英]Printed unsigned chars as hex are too long

假設我有一個非常簡單的示例:

vector<unsigned char> bytes {0xFF, 0xFF, 0xFD};

for (const char & v: bytes) {
    cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}

cout << endl;

這給出:

FFFFFFFF FFFFFFFF FFFFFFFD

但是,我想簡短一點,例如:

FF FF FD

那么,為什么還要獲得許多額外的“ FFFFF”?

如果使循環中的char保持未簽名狀態,則會得到所需的結果:

for (const unsigned char & v: bytes) {
    //     ^^^^^^^^
    cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}

autoauto&也會起作用,因為矢量元素是無符號的。

之所以得到FF是因為系統上的char是帶符號的 ,這意味着這些值在轉換為整數時會進行符號擴展。

演示

for (const char & v: bytes)

您正在將以bytesbytes每個元素隱式轉換為char ,該char似乎signed在您的平台上signed 然后,當您將char強制轉換為unsigned char時, char會經歷符號擴展,最后得到較大的十六進制值。

將以上更改為以下之一

for (const unsigned char & v: bytes)
for (auto const& v: bytes)
for (auto v: bytes) // since it's only a char copying might be better

現場演示

就像其他人所說的,發生這種情況是因為您正在將元素轉換為已簽名的char。 我更喜歡以這種方式使用for循環來防止此類錯誤:

vector<unsigned char> bytes{ 0xFF, 0xFF, 0xFD };

for (int i = 0; i < bytes.size(); i++) {
    cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(bytes[i]) << " ";
}

使用迭代器也是一個好主意。

暫無
暫無

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

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