Rpgle数据结构概率

时间:2018-04-04 09:54:23

标签: ibm-midrange rpgle

我所投入的字符如下: -
"췡전V"其为UTF16十六进制为CDE1C8040056

有人请帮助我了解发生了什么: -
1)我将我的工作CCSID改为833


2)运行的代码如下: -

D w_VIN           ds                              
D  vin1                               like(AAF010)
D  vin2                               like(AACDE1)
D  vin3                               like(AAF006)

其中: - AAF010是C(10)CCSID(1200),AACDE1是C(1)CCSID(1200),AAF006是C(6)

其中DataFld C(17)CCSID(1200) 执行的代码是: -

w_VIN  = dataFld;


EVAL datafld:x

00000     CDE1C804 00560020 00200020 00200020
00010     00200020 00200020 00200020 00200020
00020     0020.... ........ ........ ........

EVAL w_VIN:x

00000     0EC2D7B8 E50FE540 40404040 40404040
00010     40404040 40404040 40404040 40404040
00020     4040.... ........ ........ ........

我期待CDE1C8040056,我真的不明白为什么,有人请解释一下? 我如何得到我想要的结果?
问候,
Jemrug

1 个答案:

答案 0 :(得分:2)

数据结构没有明确分配给它们的数据类型。它们始终使用Job CCSID隐式修复char字段。因此w_VINCHAR() CCSID(833)。你无能为力。但是,子字段可以是您想要的任何内容,并且您可以相互叠加字段以根据需要对数据结构进行切片和切块。例如:

dcl-ds w_VIN;
  vin1          Like(aaf010);
  vin2          Like(aacde1);
  vin3          Like(aaf006);
  ucs2_VIN      Like(dataFld) Pos(1);
end-ds;

现在w_VIN未定义为dataFld,因此如果你做了转换

w_VIN = dataFld;

ucs2_VIN的定义与dataFld完全相同,如果您这样做,则不会进行转换

ucs2_VIN = dataFld;

由于ucs2_VIN显式地从数据结构的第一个字符开始,它将覆盖vin1vin2vin3。定义这些子场的顺序很重要。如果您先放置ucs_VINvin1vin2vin3将在结构中跟随它,但由于我先定义了数据结构,然后添加了其他定义最后,最后一个定义将叠加在其他定义之上。