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.