gds 格式介绍
Record Description
流式格式输出文件由可变长度的 record 组成。 record 的最小长度为四个字节。 record 可以是无限长的。 record 的前四个字节是头部。头部的前两个字节包含一个计数(一个字节 8 bit),表示 record 的总长度。该计数指示一个 record 的结束位置以及下一个 record 的开始位置。下一个 record 紧接着计数中最后一个字节开始。
头部的第三个字节是 record 类型。头部的第四个字节描述 record 中包含的数据类型。 record 的第五个字节到最后一个字节是数据。
如果输出文件是磁带,那么库的 record 将以2048字节的物理块写出。 record 可能会跨越物理块边界; record 不要求完全包含在单一的物理块中。(现在应该用不到了)
空字(null word)由两个连续的零字节组成。使用空字来填充以下空间:
- 库的最后一条 record 和其物理块的末尾之间的空间,或
- 多卷磁带流式文件中最后一条 record 和其物理块的末尾之间的空间。
Data Type Description
可能的数据类型及其值。可以在 record 的第四个字节中找到数据类型的值:
数据类型 | Value |
---|---|
No Data Present | 0 |
Bit Array | 1 |
Two-Byte Signed Integer | 2 |
Four-Byte Signed Integer | 3 |
Four-Byte Real | 4 |
Eight-Byte Real | 5 |
ASCII String | 6 |
注意: 一个字(word)由16位组成,编号从0到15,按从左到右的顺序排列。
Bit Array
位数组是一个字,其中使用某个位或一组位的值来表示数据。位数组允许一个字表示多个简单的信息单元。
Two-Byte Signed Integer
二进制补码表示法是一种在计算机中表示整数的方法,特别是用于表示有符号整数。它的主要优点是可以简化加减法运算,且能够避免零的多个表示。以下是其原理和如何计算的解释:
-
正数的补码
正数的补码和它的原码相同。
例如,8位二进制的 +5 的补码表示:原码:0000 0101补码:0000 0101
-
负数的补码
负数的补码由两部分组成:- 原码:直接表示负数的绝对值。
- 补码:对原码取反,然后加1。
2字节整数 = 1字,2进制补码表示
两字节带符号整数的范围是 -32,768 到 32,767。
以下是两字节整数的表示方式,其中 S 是符号位,M 是大小(magnitude)。
SMMMMMMM MMMMMMMM以下是两字节整数的示例:
00000000 00000001 = 1
00000000 00000010 = 2
00000000 10001001 = 137
11111111 11111111 = -1
11111111 11111110 = -2
11111111 01110111 = -137
Four-Byte Signed Integer
4字节整数 = 2字,2进制补码表示
四字节带符号整数的范围是 -2,147,483,648 到 2,147,483,647。
以下是四字节整数的表示方式,其中 S 是符号位,M 是大小(magnitude)。
SMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM
四字节整数的示例:
00000000 00000000 00000000 00000001 = 1
00000000 00000000 00000000 00000010 = 2
00000000 00000000 00000000 10001001 = 137
11111111 11111111 11111111 11111111 = -1
11111111 11111111 11111111 11111110 = -2
11111111 11111111 11111111 01110111 = -137
Four-Byte Real and Eight-Byte Real
- 4字节实数 = 2字,浮点数表示
- 8字节实数 = 4字,浮点数表示
对于所有非零值:
-
浮点数由三部分组成:符号位、指数位和尾数。
-
浮点数的值定义为:尾数 × (16 的指数部分的实际值)
-
指数部分(第1-7位)采用 Excess-64 表示法,7位字段表示的数字比实际指数大64。
-
尾数始终是一个大于或等于 1/16 且小于 1 的正分数。对于 4字节实数,尾数是第8到第31位。对于 8字节实数,尾数是第8到第63位。
-
二进制小数点位于第8位的左边。
-
第8位代表值 1/2,第9位代表 1/4,以此类推。
-
为了保持尾数在 1/16 到 1 的范围内,浮点数运算的结果会进行归一化。归一化是一个过程,其中尾数会每次向左移动一个十六进制位,直到其最左边的四个位代表一个非零值。每次移动一个十六进制位,指数会减少 1。由于尾数每次移动四个位,所以归一化后的尾数的最左边三个位可能是零。零值(也称为真零)由所有位都为零的数字表示。
以下是 4 字节和 8 字节实数的表示方式,其中 S 是符号位,E 是指数,M 是尾数。包含了 4 字节实数的示例。实数的负值表示方式与正值完全相同,只不过最高位是 1,而不是 0。在 8 字节实数表示法中,前四个字节与 4 字节实数表示法完全相同。后四个字节包含额外的二进制位,以提供更高的精度。4 字节实数:
SMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM8 字节实数:
SMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM
MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM4 字节实数示例:
注意:以下示例中,前六行的 7 位指数字段为 65。实际指数为 65 - 64 = 1。01000001 00010000 00000000 00000000 = 1
01000001 00100000 00000000 00000000 = 2
01000001 00110000 00000000 00000000 = 3
11000001 00010000 00000000 00000000 = -1
11000001 00100000 00000000 00000000 = -2
11000001 00110000 00000000 00000000 = -3
01000000 10000000 00000000 00000000 = 0.5
01000000 10011001 10011001 10011001 = 0.6
01000000 10110011 00110011 00110011 = 0.1
01000001 00011000 00000000 00000000 = 1.5
01000001 00011001 10011001 10011001 = 1.6
01000001 00011011 00110011 00110011 = 1.1
00000000 00000000 00000000 00000000 = 0
01000001 00010000 00000000 00000000 = 1
01000001 10100000 00000000 00000000 = 10
01000010 01100100 00000000 00000000 = 100
01000011 00111110 10000000 00000000 = 1000
01000100 00100111 00010000 00000000 = 10000
01000101 00011000 01101010 00000000 = 100000
ASCII 字符串
一组 ASCII 字符,每个字符由一个字节表示。所有奇数长度的字符串必须使用一个空字符(数字零)进行填充,并且包含 ASCII 字符串的 record 的字节计数必须包括此空字符。流式读取程序必须查找空字符,并在空字符存在时将字符串长度减 1。