RDW详解
概述
本文需要对Mainframe文件结构有基本的了解.
RDW是Record Descriptor Word(记录描述字)的缩写. RDW只存在变长记录(variable-length record)中,用于记录变长记录的实际长度.
对COBOL程序员,RDW是透明的.但对HLASM程序员,若要操作变长记录,了解RDW的结构就非常必要了.
约定
每条变长记录的前4个Bytes为RDW.定义文件时LRECL应该考虑RDW的长度,如LRECL=80,那么记录实际上最长只能是76Bytes,还有4Bytes是RDW.
RDW的结构.RDW前2个Bytes为binary形式(half word)的记录长度,RDW后2个Bytes恒为low-value.
RDW=记录长度+RDW长度(即4Bytes)
以下都以文件TEST.FILEA为例:
****** ***************************************
000001 1
000002 22
000003 ABCDEFGHIGKLMNOPQRSTUVWXYZ
查看
要看RDW很简单,使用SyncSort(或DFSort)把前2个Bytes转换为Display:
OUTFIL BUILD=(1,2,BI,TO=ZD),VTOF
结果:
00005
00006
00030
扩展知识(BDW)
对于VB(Variable-bloacked),还有一个叫BDW的额外数据,BDW与RDW相似,BDW则是一个块的长度.
V(RECFM=V):
记录1 记录2
RDW |
内容 |
RDW |
内容 |
VB(RECFM=VB):
块1
BDW |
RDW |
内容 |
RDW |
内容 |
… |
块2
BDW |
RDW |
内容 |
RDW |
内容 |
… |
想要看到BDW的内容则需要用IDCAM把文件的内容DUMP出来,要注意RECFM=U,声明为无格式的文件(可想象为Windows的二进制文件).这样就会把所有的内容都DUMP出来(包括BDW):
//VIEWBDW EXEC PGM=IDCAM
//VBINPUT DD DSN=TEST.FILEA,DISP=SHR,RECFM=U
//SYSIN DD *
PRINT INFILE(VBINPUT) DUMP
//SYSPRINT DD SYSOUT=*
结果:
002D000000050000F1000600 00F2F200 1E0000C1 C2C3C4C5 C6C7C8C9 D1D2D3D4 D5D6D7D8 D9E2E3E4 E5E6E7
只有3条记录,都在第一个块中.2D(16)为块的长度,2D(16)=45(10) = 4(BDW) + 4*3(RDW) + 1(记录1) + 2(记录2) + 26(记录3)