【问题标题】:Delphi ANSI to EBCDIC conversion array problemDelphi ANSI到EBCDIC转换数组问题
【发布时间】:2020-02-13 09:28:35
【问题描述】:

我想在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.

【问题讨论】:

    标签: arrays delphi


    【解决方案1】:

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

    在第一种和第二种情况下,只需应用Ord 函数

    A2E[Ord(s[i])]
    

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


    为了完整性:HIGHCHARUNICODE directive

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

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

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

    当 HIGHCHARUNICODE 为 ON 时:

    所有文字都被解析为 WideChar。

    【讨论】:

    • 我猜这是由于您的语言环境代码页 (Windows-1251) 中的 #255 代表 я - cyrillic small letter ya,它作为 unicode 字符具有序数值 1103。 OP 的代码页可能是 Windows-1250),#255 代表˙ - dot above,unicode 序值为729
    • @Peter Wolf 是的,这听起来很合理。
    【解决方案2】:

    小心:一旦您将 Char 转换为 AnsiChar,并将 String 转换为 AnsiString (或 RawByteString)这种转换会起作用,但是......这种方法(和常量数组)只为一个 EBCDIC 代码页 和一个 EBCDIC 代码页定义strong>扩展 ASCII 代码页...每个代码页都有一个特定的翻译数组。有一个从标准 IBM-EBCDIC 到未扩展 ASCII(7 位)的全局转换……但如果您想包含扩展 ASCII(代码页),则可以进行很多转换(查看IBM website

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2017-02-03
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多