NVMe架构与操作原理 - ✅ 一、ASCII 字符串与十六进制 ASCII 字符串 (第16页)
NVME2.0协议解读 1 min read

NVMe架构与操作原理 - ✅ 一、ASCII 字符串与十六进制 ASCII 字符串 (第16页)

Blog Author

NVM Express® Base Specification, revision 2.0b 第 1.4 节中,接下来的这部分讲述了 数值表示法的规范约定。虽然这些内容看起来是格式问题,但对我们准确解析字段数值、命令参数、寄存器位值等是至关重要的基础知识。接下来我会结合具体示例,为你深入讲解这段内容。


✅ 一、ASCII 字符串与十六进制 ASCII 字符串

🔹 普通 ASCII 字符串(回顾)

  • 字符码范围:20h7Eh,即可显示字符。
  • 常见用途:Model Number (MN)Serial Number (SN)NQNFirmware Revision 等字段。

🔹 十六进制 ASCII 字符串(Hexadecimal ASCII string)

仅允许包含以下字符: - 0 ~ 9 - A ~ F(大写) - a ~ f(小写)

🧩 例子: - ✅ 合法的十六进制 ASCII 字符串:"1F2a9B" - ❌ 非法示例:"1G23"(含非法字符 G)

常见用途:如表示 命名空间 UUID、认证 token、密钥摘要值(hash digest)等字段。


✅ 二、数值进制及其写法规范

📍 1. 十六进制(Hexadecimal)

  • 格式:后缀小写 h
  • 示例:0FFFh, 80h

📘 多于 8 位的十六进制数:

  • 使用下划线 _ 每 8 位分组:
  • 示例:1E_DEADBEEFh

实际应用: 在协议中常见于长地址字段、大容量寄存器值,如:128-bit UUID, 128-bit hash key


📍 2. 二进制(Binary)

  • 格式:后缀小写 b
  • 示例:1001b, 10b

📘 多于 4 位的二进制数:

  • 使用下划线 _ 每 4 位分组:
  • 示例:1000_0101_0010b

实际应用: 常用于字段位域(bitfield)结构解析,如:

Controller Capabilities Register(CAP):
  Bits [0:0]    – MQES (Max Queue Entries Supported)
  Bits [1:1]    – CQR  (Contiguous Queues Required)

📍 3. 十进制(Decimal)

  • 格式:仅数字,不带后缀(不能跟 bh
  • 示例:175, 1024, 32768

十进制表示法的格式约定

规则 举例
a. 小数点使用 . 3.1415
b. 千位分隔符使用 , 1,000, 2,048,000
c. 小数部分不使用逗号 1,024.512 ✅(不是 1,024.512,000
d. 年份不使用逗号 2023 ✅(不是 2,023

✅ 三、典型应用示例对比

类型 示例 用途
十进制(无后缀) 1024 常用于容量、计数值
十六进制(加 h) FFh, 1E_DEAD_BEE1h 控制器寄存器值、标识符
二进制(加 b) 1010b, 0011_1100b 位标志、寄存器位图
十六进制 ASCII 字符串 "A5f9" 表示 UUID、身份令牌等

🧠 补充技巧:如何判断某字段是 hex、binary 还是 decimal?

当你在阅读 NVMe 结构表时,如果看到如下情形,可以这样判断:

  • 字段默认数值如 0, 1, 255 → 默认十进制;
  • 若有后缀 h → 十六进制;
  • 若有后缀 b → 二进制;
  • 长字符串包含 a-f, 0-9,且被称为 "hex ASCII" → 十六进制 ASCII 字符串;

✅ 总结记忆口诀:

"十六后 h,二进后 b,分组用下划,不带后缀是十进。"
"ASCII 定长填空格,hex 字符需合法。"


你现在已经掌握了 NVMe 协议中字段数值和字符串表示的标准语法。这些知识会频繁出现在控制器寄存器(如 CAP、VS、CC)、命令字段(如 CDW10~15)、日志条目、Identify 数据结构等部分。

是否希望我结合具体结构(如 Identify Controller 或 Log Page)来演示如何解读这些字段?我们可以立即开始做字段级位图还原!