Skip to main content

4. Data Conversion Primitives (数据转换原语)

本文档定义的方案中使用两个数据转换原语 (Data Conversion Primitives):

  • I2OSP - 整数到八位字节串原语 (Integer-to-Octet-String Primitive)
  • OS2IP - 八位字节串到整数原语 (Octet-String-to-Integer Primitive)

对于本文档的目的,并且与ASN.1语法一致,八位字节串 (Octet String) 是八位字节(8比特字节)的有序序列. 该序列从第一个(按惯例,最左边)到最后一个(最右边)进行索引. 为了与整数之间进行转换,在以下转换原语中,第一个八位字节被视为最高有效位.

4.1. I2OSP

I2OSP将非负整数转换为指定长度的八位字节串.

I2OSP (x, xLen)

输入 (Input)

x        要转换的非负整数
xLen 结果八位字节串的预期长度

输出 (Output)

X        长度为xLen的对应八位字节串

错误 (Error)

"integer too large" (整数过大)

步骤 (Steps)

步骤1. 如果 x >= 256^xLen,输出 "integer too large" 并停止.

步骤2. 将整数x写成其唯一的xLen位256进制表示:

x = x_(xLen-1) * 256^(xLen-1) + x_(xLen-2) * 256^(xLen-2) + ... + x_1 * 256 + x_0

其中 0 <= x_i < 256 (注意,如果x小于256^(xLen-1),一个或多个前导数字将为零).

步骤3. 令八位字节X_i的整数值为x_(xLen-i),其中 1 <= i <= xLen. 输出八位字节串:

X = X_1 X_2 ... X_xLen

4.2. OS2IP

OS2IP将八位字节串转换为非负整数.

OS2IP (X)

输入 (Input)

X        要转换的八位字节串

输出 (Output)

x        对应的非负整数

步骤 (Steps)

步骤1. 令 X_1 X_2 ... X_xLen 为X从第一个到最后一个的八位字节,令x_(xLen-i)为八位字节X_i的整数值,其中 1 <= i <= xLen.

步骤2. 令:

x = x_(xLen-1) * 256^(xLen-1) + x_(xLen-2) * 256^(xLen-2) + ... + x_1 * 256 + x_0

步骤3. 输出x.