C++如何格式化输出十六进制数据查看器

云辰大大_1792

云辰大大_1792

2026-07-17

895人浏览

原创

使用std::hex、std::setw(2)、std::setfill('0')和static_cast(unsigned char)可正确输出固定宽度、补零、大写的十六进制字节;需避免std::dec干扰、char符号扩展及C字符串截断,推荐用std::vector存储二进制数据。

c++如何格式化输出十六进制数据查看器

用 std::hex 和 std::setw 输出固定宽度十六进制数

直接用 std::hex 会让数字输出不带前缀、不补零、宽度不一致,根本没法当数据查看器看——比如 0xa 和 0xff 对齐困难,更别说多字节数据了。

必须组合使用:std::hex 控制进制,std::setw 固定字段宽度,std::setfill('0') 补零,std::uppercase 可选大写(如 A 而非 a)。

  • std::setw 是**一次性**的,只影响下一次输出,得每字节都调一次
  • 对 unsigned char 输出要先转成 int,否则会当字符打印(比如 0x00 变成空字符,终端看不见)
  • 别用 std::dec 混在中间重置——它会把后续所有整数变回十进制,容易漏切回 hex

示例:

std::cout (static_cast<unsigned char>(data[i])) <h3>按地址偏移分组显示(类似 hexdump 的行格式)</h3>
<p>纯一长串十六进制没意义,数据查看器必须有地址列 + 每行固定字节数(常见 16 字节/行)+ ASCII 预览列。</p>
<p>关键点不在进制转换,而在布局控制:</p>
<ul>
<li>地址用 <code>std::internal</code> + <code>std::setw(8)</code> 左对齐地址字段(如 <code>00000000:</code>)</li>
<li>每行 16 字节就循环 16 次,不足补 <code>??</code> 或空格,避免错位</li>
<li>ASCII 列要过滤不可见字符:用 <code>isprint(c) && c >= 0x20 && c  判定,否则乱码或终端异常</code>
</li>
<li>别忘了每行末尾换行,且 <code>std::setw</code> 不会自动刷新缓冲区,必要时加 <code>std::flush</code>
</li>
</ul>
<h3>处理<a style="color:#f60; text-decoration:underline;" title="二进制数" href="https://m.php.cn/zt/17637.html" target="_blank">二进制数</a>据中的 null 字节和非 ASCII 字符</h3>
<p>读文件或网络包时,<code>std::string</code> 容易被 <code><p>读文件或网络包时,<code>std::string</code> 容易被 <code>\0</code> 截断;用 <code>std::vector<uint8_t></uint8_t></code> 或 <code>std::span<const uint8_t></const></code>(C++20)更安全。</p></code> 截断;用 <code>std::vector<uint8_t></uint8_t></code> 或 <code>std::span<const uint8_t></const></code>(C++20)更安全。</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2823" title="C++14"><img
														src="https://img.php.cn/upload/manual/001/431/639/6ac8b33c327c4749.png" alt="C++14" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="overflowclass">C++14</a>
													<p class="overflowclass">C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。</p>
												</div>
												<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div>
<p>输出时尤其注意:</p>
<ul>
<li>
<code>char</code> 类型有符号性依赖平台:x86 默认 signed,<code>0xFF</code> 会被解释为 <code>-1</code>,再转 <code>int</code> 得到 <code>-1</code>,输出成 <code>ffffffff</code>(32 位补码)——必须先强转 <code>unsigned char</code> 再转 <code>int</code>
</li>
<li>如果原始数据是 <code>const char*</code>,别直接丢给 <code>std::cout ,那是 C 字符串语义,遇到 \0 就停</code>
</li>
<li>想支持宽字符或 UTF-8 预览?先做字节级 dump,ASCII 列只负责可打印 ASCII,别试图 decode</li>
</ul>
<h3>性能敏感场景下避免流操作符开销</h3>
<p>调试时小数据无所谓,但 dump 几 MB 内存时,<code>std::cout  可能慢 5–10 倍于 <code>printf</code> 或 <code>write()</code> 系统调用。</code></p>
<p>真要提速,可以:</p>
<ul>
<li>用 <code>std::sprintf</code> 或 <code>std::to_chars</code>(C++17)预生成十六进制字符串,再批量输出</li>
<li>禁用同步:在程序开头加 <code>std::ios::sync_with_stdio(false)</code>,但之后不能混用 C stdio(如 <code>printf</code>)</li>
<li>缓冲输出:把整行拼成 <code>std::string</code> 再一次 <code>std::cout ,比 48 次小输出快得多</code>
</li>
<li>若只是日志用途,考虑直接写入文件描述符(<code>write(STDOUT_FILENO, buf, len)</code>),绕过 stream 缓冲逻辑</li>
</ul>
<p>地址对齐、null 字节处理、符号扩展——这三个地方出错,dump 出来的结果看起来“像”,但数值全错,而且很难一眼发现。</p></unsigned>

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2288

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

347

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习