Följ Black Week på SweClockers

C++ - Skriva ut & formatera byte-värde som hex [löst]

Permalänk
Medlem

C++ - Skriva ut & formatera byte-värde som hex [löst]

Hej,

Som en del av ett projekt behöver jag skriva ut byte-värden i hexadecimal form. Dock har jag ett litet problem med "vadderingen" aka "fill" som det heter i C++.

Nedan är det korrekt formaterade byte-värdet så som det bör se vid utskrift:

0f

och här är vad som händer med min kod:

f

Och min kod:

#include <iostream> #include <iomanip> #include <cstdint> int main() { uint8_t test = 0x0f; std::cout << std::hex << std::setw(2) << std::setfill('0'); std::cout << (uint16_t)0x0a << '\n'; std::cout << (uint16_t)test << '\n'; return 0; } //Ger: 0a f

Om jag kör denna version så ser "test" korrekt ut:

#include <iostream> #include <iomanip> #include <cstdint> int main() { uint8_t test = 0x0f; std::cout << std::hex << std::setw(2) << std::setfill('0'); std::cout << (uint16_t)test << '\n'; return 0; } //Ger: 0f

Hur kommer detta sig?

Permalänk
Hedersmedlem

Det ser ju ut att fungera första gången, så jag antar att stream-operatörerna bara appliceras en gång?
setw() ser ut att vara en manipulator som bara används på nästa sak i streamen, medan std::hex verkar "hålla i sig", samma som setfill. Så sannolikt bör du anropa setw varje gång, och övriga bara i början.

Detta fungerar:

#include <iostream> #include <iomanip> #include <cstdint> int main() { uint8_t test = 0x0f; std::cout << std::hex << std::setfill('0'); std::cout << std::setw(2) << (uint16_t)0x0a << '\n'; std::cout << std::setw(2) << (uint16_t)test << '\n'; return 0; }

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem
Skrivet av Thomas:

Det ser ju ut att fungera första gången, så jag antar att stream-operatörerna bara appliceras en gång?
setw() ser ut att vara en manipulator som bara används på nästa sak i streamen, medan std::hex verkar "hålla i sig", samma som setfill. Så sannolikt bör du anropa setw varje gång, och övriga bara i början.

Detta fungerar:

#include <iostream> #include <iomanip> #include <cstdint> int main() { uint8_t test = 0x0f; std::cout << std::hex << std::setfill('0'); std::cout << std::setw(2) << (uint16_t)0x0a << '\n'; std::cout << std::setw(2) << (uint16_t)test << '\n'; return 0; }

Toppen! Tack för tipset som "persistens".

Permalänk
Hedersmedlem

Om man har en modernare kompilator (c++20) kan man även använda <format>

#include <iostream> #include <format> #include <cstdint> int main() { uint8_t test = 0x0f; std::cout << std::format("{:02x}", test) << std::endl; return 0; }