簡體   English   中英

C++:將字節數組序列化為十六進制字符串

[英]C++: Serialize byte array to hex string

我(C++ 新手)目前正在嘗試實現以下功能:

std::string bytes_to_hex(const std::string &bytes);

該函數應該基本上返回給定字節數組的 ba​​se16 編碼:

std::string input{0xde, 0xad, 0xbe, 0xef} => "deadbeef"

我的第一個版本並不像我想象的那樣工作:

std::string bytes_to_hex(const std::string &bytes) {
    std::ostringstream ss;
    ss << std::hex;

    for (auto &c : bytes) {
        ss << std::setfill('0') << std::setw(2) << +c;
    }

    return ss.str();
}

使用此函數,輸出為:

ffffffdeffffffadffffffbeffffffef

經過一些實驗,我發現這個版本看起來更好:

std::string bytes_to_hex(const std::string &bytes) {
    std::ostringstream ss;
    ss << std::hex;

    for (const char &c : bytes) {
        ss << std::setfill('0') << std::setw(2) << +(static_cast<uint8_t>(c));
    }

    return ss.str();
}

輸出如預期:

deadbeef

我的問題是:

  • 為什么第二個版本有效而​​第一個版本無效? 這里的主要區別是什么?
  • 第二個版本是正確實現了我的初衷還是會出現其他問題?

正如我在評論中提到的,一元+強制整數提升 當這種情況發生時,有符號類型會被符號擴展,這對於二進制補碼編碼的整數意味着負數(最左邊的位是1 )用二進制數字左填充(即0xde變成0xffffffde )。

還提到了char可以是signedunsigned ,這取決於編譯器。 由於您得到的輸出,我們可以說在您的情況下char實際上是已signed char

您發現的簡單解決方案是首先將字符轉換為unsigned char ,然后(使用一元+ )將其提升為int

暫無
暫無

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

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