2

我想在 ANSI 和 EBCDIC 之间进行转换,

我找到了课程,但它给了我错误

[dcc32 错误] EBCDIC.PAS(60): E2072 元素数 (256) 与声明 (730) 不同

问题出在这一行A2E:array[#0..#255] of char但我不知道如何解决。

使它像A2E:array[0..255] of char不是解决方案,因为我需要像result[i]:=A2E[string[i]]一样使用它

Unit EBCDIC;

Interface

Uses
 SysUtils;



function AnsiToEbcdicW(s:string):string;
function EbcdicToAnsiW(s:string):string;

{ ANSI to EBCDIC translation }
Const
 A2E:array[#0..#255] of char=(
  #$00,#$01,#$02,#$03,#$37,#$2D,#$2E,#$2F,#$16,#$05,#$25,#$0B,#$0C,#$0D,#$0E,#$0F,
  #$10,#$11,#$12,#$13,#$3C,#$3D,#$32,#$26,#$18,#$19,#$3F,#$27,#$1C,#$1D,#$1E,#$1F,
  #$40,#$4F,#$7F,#$B1,#$5B,#$6C,#$50,#$7D,#$4D,#$5D,#$5C,#$4E,#$6B,#$60,#$4B,#$61,
  #$F0,#$F1,#$F2,#$F3,#$F4,#$F5,#$F6,#$F7,#$F8,#$F9,#$7A,#$5E,#$4C,#$7E,#$6E,#$6F,
  #$44,#$C1,#$C2,#$C3,#$C4,#$C5,#$C6,#$C7,#$C8,#$C9,#$D1,#$D2,#$D3,#$D4,#$D5,#$D6,
  #$D7,#$D8,#$D9,#$E2,#$E3,#$E4,#$E5,#$E6,#$E7,#$E8,#$E9,#$90,#$48,#$B5,#$5F,#$6D,
  #$A0,#$81,#$82,#$83,#$84,#$85,#$86,#$87,#$88,#$89,#$91,#$92,#$93,#$94,#$95,#$96,
  #$97,#$98,#$99,#$A2,#$A3,#$A4,#$A5,#$A6,#$A7,#$A8,#$A9,#$51,#$BB,#$54,#$BD,#$07,
  #$20,#$21,#$22,#$23,#$24,#$15,#$06,#$17,#$28,#$29,#$2A,#$2B,#$2C,#$09,#$0A,#$1B,
  #$30,#$31,#$1A,#$33,#$34,#$35,#$36,#$08,#$38,#$39,#$3A,#$3B,#$04,#$14,#$3E,#$FF,
  #$41,#$AA,#$B0,#$7B,#$9F,#$B2,#$DD,#$5A,#$A1,#$B4,#$9A,#$8A,#$BA,#$CA,#$AF,#$BC,
  #$4A,#$8F,#$EA,#$FA,#$BE,#$79,#$B6,#$B3,#$9D,#$DA,#$9B,#$8B,#$B7,#$B8,#$B9,#$AB,
  #$64,#$65,#$62,#$66,#$63,#$67,#$9E,#$68,#$74,#$71,#$72,#$73,#$78,#$75,#$76,#$77,
  #$AC,#$69,#$ED,#$EE,#$EB,#$EF,#$EC,#$BF,#$80,#$FD,#$FE,#$FB,#$FC,#$AD,#$AE,#$59,
  #$7C,#$45,#$42,#$46,#$43,#$47,#$9C,#$E0,#$D0,#$C0,#$52,#$53,#$58,#$55,#$56,#$57,
  #$8C,#$49,#$CD,#$CE,#$CB,#$CF,#$CC,#$E1,#$70,#$6A,#$DE,#$DB,#$DC,#$8D,#$8E,#$DF);

{ EBCDIC to ANSI translation }
Const
 E2A:array[#0..#255] of char=(
  #$00,#$01,#$02,#$03,#$9C,#$09,#$86,#$7F,#$97,#$8D,#$8E,#$0B,#$0C,#$0D,#$0E,#$0F,
  #$10,#$11,#$12,#$13,#$9D,#$85,#$08,#$87,#$18,#$19,#$92,#$8F,#$1C,#$1D,#$1E,#$1F,
  #$80,#$81,#$82,#$83,#$84,#$0A,#$17,#$1B,#$88,#$89,#$8A,#$8B,#$8C,#$05,#$06,#$07,
  #$90,#$91,#$16,#$93,#$94,#$95,#$96,#$04,#$98,#$99,#$9A,#$9B,#$14,#$15,#$9E,#$1A,
  #$20,#$A0,#$E2,#$E4,#$40,#$E1,#$E3,#$E5,#$5C,#$F1,#$B0,#$2E,#$3C,#$28,#$2B,#$21,
  #$26,#$7B,#$EA,#$EB,#$7D,#$ED,#$EE,#$EF,#$EC,#$DF,#$A7,#$24,#$2A,#$29,#$3B,#$5E,
  #$2D,#$2F,#$C2,#$C4,#$C0,#$C1,#$C3,#$C5,#$C7,#$D1,#$F9,#$2C,#$25,#$5F,#$3E,#$3F,
  #$F8,#$C9,#$CA,#$CB,#$C8,#$CD,#$CE,#$CF,#$CC,#$B5,#$3A,#$A3,#$E0,#$27,#$3D,#$22,
  #$D8,#$61,#$62,#$63,#$64,#$65,#$66,#$67,#$68,#$69,#$AB,#$BB,#$F0,#$FD,#$FE,#$B1,
  #$5B,#$6A,#$6B,#$6C,#$6D,#$6E,#$6F,#$70,#$71,#$72,#$AA,#$BA,#$E6,#$B8,#$C6,#$A4,
  #$60,#$A8,#$73,#$74,#$75,#$76,#$77,#$78,#$79,#$7A,#$A1,#$BF,#$D0,#$DD,#$DE,#$AE,
  #$A2,#$23,#$A5,#$B7,#$A9,#$5D,#$B6,#$BC,#$BD,#$BE,#$AC,#$7C,#$AF,#$7E,#$B4,#$D7,
  #$E9,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$AD,#$F4,#$F6,#$F2,#$F3,#$F5,
  #$E8,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,#$50,#$51,#$52,#$B9,#$FB,#$FC,#$A6,#$FA,#$FF,
  #$E7,#$F7,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$B2,#$D4,#$D6,#$D2,#$D3,#$D5,
  #$30,#$31,#$32,#$33,#$34,#$35,#$36,#$37,#$38,#$39,#$B3,#$DB,#$DC,#$D9,#$DA,#$9F
 );

Implementation

Type
 PByte=^AByte;
 AByte=Array[byte] of byte;

Function AnsiToEbcdicW(s:string):string;
 var
  i:integer;
 begin
  result:=s;
  for i:=1 to length(s) do result[i]:=A2E[s[i]];
 end;

Function EbcdicToAnsiW(s:string):string;
 var
  i:integer;
 begin
  result:=s;
  for i:=1 to length(s) do result[i]:=E2A[s[i]];
 end;

end.
4

2 回答 2

2

您可以使用array[0..255]orarray[byte]array[AnsiChar](适当地将所有更改stringansistring等)

在第一种和第二种情况下,只需应用Ord功能

A2E[Ord(s[i])]

引用的代码确实给出了编译器错误-在我的情况下(10.2 Delphi 版本,俄语语言环境)编译器认为该范围#0..#255包含 1104 个项目-奇怪的违规从#128 (标准 ASCII 表中的第一个值)开始并结束于#256


为了完整起见:HIGHCHARUNICODE 指令

{$HIGHCHARUNICODE ON} 指令控制 >characters #$80 ... #$FF (#128 ... #255) 的行为。

当 HIGHCHARUNICODE 为 OFF 时://默认状态

所有十进制 #xxx n 位数文字都被解析为 AnsiChar。所有十六进制 #$xx 2 位文字都被解析为 AnsiChar。所有十六进制 #$xxxx 4 位文字都被解析为 WideChar。

当 HIGHCHARUNICODE 为 ON 时:

所有文字都被解析为 WideChar。

于 2020-02-13T09:39:18.463 回答
0

注意:一旦您将Char转换为AnsiChar并将String转换为AnsiString(或RawByteString),此转换将起作用,但是...此方法(和常量数组)仅针对一个EBCDIC 代码页和一个扩展 ASCII 代码定义Page ... 每个代码页都有一个特定的翻译数组。有一个从标准 IBM-EBCDIC 到未扩展 ASCII(7 位)的全局转换......但如果您想包含扩展 ASCII(代码页)(请查看IBM 网站

于 2020-09-25T15:40:03.570 回答