Delphi ANSI в EBCDI C проблема с массивом преобразования - PullRequest
2 голосов
/ 13 февраля 2020

Я хочу сделать преобразование между ANSI и EBCDI C,

Я нашел класс, но он дает мне ошибку

[Ошибка dcc32] EBCDI C .PAS (60): E2072 Количество элементов (256) отличается от объявления (730)

проблема в этой строке A2E: массив [# 0 .. # 255] для char но я не знаю, как ее решить.

сделать его похожим на A2E: массив [0..255] char не является решением, так как мне нужно использовать его как результат [i]: = A2E [строка [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.

1 Ответ

2 голосов
/ 13 февраля 2020

Вы можете использовать array[0..255] или array[byte] или array[AnsiChar] (с соответствующим изменением всех string на ansistring и т. Д.)

В первом и втором случаях просто примените Ord function

A2E[Ord(s[i])]

Приведенный код действительно дает ошибку компилятора - в моем случае (10.2 Delphi версия, русская локаль) компилятор считает, что диапазон #0..#255 содержит 1104 элемента - странное нарушение начинается с #128 (первое значение из стандартной таблицы ASCII) и заканчивается на #256


Для полноты: Директива HIGHCHARUNICODE

{$ Директива HIGHCHARUNICODE ON} управляет поведением> символов # $ 80 ... # $ FF (# 128 ... # 255).

Когда HIGHCHARUNICODE выключен: // Состояние по умолчанию

Все десятичные #xxx n-di git литералы анализируются как AnsiChar. Все шестнадцатеричные литералы # $ xx 2-di git анализируются как AnsiChar. Все шестнадцатеричные литералы # $ xxxx 4-di git анализируются как WideChar.

Когда HIGHCHARUNICODE включен:

Все литералы анализируются как WideChar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...