📄 ecc200.~pas
字号:
Byte3 := C40Value(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if (Source[SourceIndex] - 128) in C40Shift2Set then
begin
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 30;
Byte2 := 1;
Byte3 := C40Value(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if (Source[SourceIndex] - 128) in C40Shift3Set then
begin
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 30;
Byte2 := 2;
Byte3 := C40Value(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else raise Exception.Create('C40字符集设计有遗漏, 请通知开发人员!');
end;
end;
function C40_Encode(Shape: TECC200Shape; EncodeMode: TEncodeMode; var Source: TByteArray; var SourceIndex: Integer; var Buffer: TByteArray; var BufferIndex: Integer): TEncodeMode;
var
State: TTriByteState;
Byte1, Byte2, Byte3: Byte;
begin
State := tsReady;
while SourceIndex < Length(Source) do
begin
case State of
tsReady:
begin
Result := LookAhead(Source, SourceIndex, EncodeMode);
if Result <> EncodeMode then
begin
SwitchMode(Source, SourceIndex, Buffer, BufferIndex, EncodeMode, Result);
Exit;
end;
State := C40_EncodeFromReady(Source, SourceIndex, Buffer, BufferIndex, Byte1, Byte2, Byte3);
end;
tsByte1:
begin
State := C40_EncodeFromByte1(Source, SourceIndex, Buffer, BufferIndex, Byte1, Byte2, Byte3);
end;
tsByte2:
begin
State := C40_EncodeFromByte2(Source, SourceIndex, Buffer, BufferIndex, Byte1, Byte2, Byte3);
end;
end;
end;
case State of
tsReady:
begin
if not UpToBound(Shape, BufferIndex) then
begin
if NearestSize(Shape, BufferIndex) - BufferIndex > 1 then
begin
SwitchTriByteBack(Buffer, BufferIndex);
Result := emASCII;
Exit;
end;
end;
end;
tsByte1:
begin
case NearestSize(Shape, BufferIndex) - BufferIndex of
1:
begin
Buffer[BufferIndex] := Source[SourceIndex - 1] + 1;
Inc(BufferIndex);
Result := emASCII;
Exit;
end;
else
begin
SwitchTriByteBack(Buffer, BufferIndex);
Buffer[BufferIndex] := Source[SourceIndex - 1] + 1;
Inc(BufferIndex);
Result := emASCII;
Exit;
end;
end;
end;
tsByte2:
begin
case NearestSize(Shape, BufferIndex) - BufferIndex of
2:
begin
Byte3 := 0;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
end;
else
begin
SwitchTriByteBack(Buffer, BufferIndex);
Result := emASCII;
Buffer[BufferIndex] := Source[SourceIndex - 2] + 1; Inc(BufferIndex);
Buffer[BufferIndex] := Source[SourceIndex - 1] + 1; Inc(BufferIndex);
end;
end;
end;
end;
end;
function TextValue(ASCII: Byte) : Byte;
begin
case ASCII of
32: Result := 3;
48..57: Result := ASCII - 48 + 4;
65..90: Result := ASCII - 65 + 1;
00..31: Result := ASCII;
33..47: Result := ASCII - 33;
58..64: Result := ASCII - 58 + 15;
91..95: Result := ASCII - 91 + 22;
96: Result := 0;
97..127: Result := ASCII - 97 + 14;
else raise Exception.Create('Text编码算法错误,请通知开发人员! 错误信息:ASCII码大于127');
end;
end;
function Text_EncodeFromReady(
var Source: TByteArray;
var SourceIndex: Integer;
var Buffer: TByteArray;
var BufferIndex: Integer;
var Byte1, Byte2, Byte3: Byte): TTriByteState;
begin
if Source[SourceIndex] in TextBasicSet then
begin
Byte1 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte1;
end
else if Source[SourceIndex] in TextShift1Set then
begin
Byte1 := 0;
Byte2 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte2;
end
else if Source[SourceIndex] in TextShift2Set then
begin
Byte1 := 1;
Byte2 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte2;
end
else if Source[SourceIndex] in TextShift3Set then
begin
Byte1 := 2;
Byte2 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte2;
end
else if Source[SourceIndex] > 127 then
begin
if (Source[SourceIndex] - 128) in TextBasicSet then
begin
Byte1 := 1;
Byte2 := 30;
Byte3 := TextValue(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if (Source[SourceIndex] - 128) in TextShift1Set then
begin
Byte1 := 1;
Byte2 := 30;
Byte3 := 0;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Inc(BufferIndex, 2);
Byte1 := TextValue(Source[SourceIndex]);
Result := tsByte1;
end
else if (Source[SourceIndex] - 128) in TextShift2Set then
begin
Byte1 := 1;
Byte2 := 30;
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Inc(SourceIndex, 2);
Byte1 := TextValue(Source[SourceIndex]);
Result := tsByte1;
end
else if (Source[SourceIndex] - 128) in TextShift3Set then
begin
Byte1 := 1;
Byte2 := 30;
Byte3 := 2;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Inc(BufferIndex, 2);
Byte1 := TextValue(Source[SourceIndex]);
Result := tsByte1;
end
else raise Exception.Create('Text字符集设计有遗漏, 请通知开发人员!');
end;
end;
function Text_EncodeFromByte1(
var Source: TByteArray;
var SourceIndex: Integer;
var Buffer: TByteArray;
var BufferIndex: Integer;
var Byte1, Byte2, Byte3: Byte): TTriByteState;
begin
if Source[SourceIndex] in TextBasicSet then
begin
Byte2 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte2;
end
else if Source[SourceIndex] in TextShift1Set then
begin
Byte2 := 0;
Byte3 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if Source[SourceIndex] in TextShift2Set then
begin
Byte2 := 1;
Byte3 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if Source[SourceIndex] in TextShift3Set then
begin
Byte2 := 2;
Byte3 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if Source[SourceIndex] > 127 then
begin
if (Source[SourceIndex] - 128) in TextBasicSet then
begin
Byte2 := 1;
Byte3 := 30;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := TextValue(Source[SourceIndex]);
Result := tsByte1;
end
else if (Source[SourceIndex] - 128) in TextShift1Set then
begin
Byte2 := 1;
Byte3 := 30;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 0;
Byte2 := TextValue(Source[SourceIndex]);
Result := tsByte2;
end
else if (Source[SourceIndex] - 128) in TextShift2Set then
begin
Byte2 := 1;
Byte3 := 30;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 1;
Byte2 := TextValue(Source[SourceIndex]);
Result := tsByte2;
end
else if (Source[SourceIndex] - 128) in TextShift3Set then
begin
Byte2 := 1;
Byte3 := 30;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 2;
Byte2 := TextValue(Source[SourceIndex]);
Result := tsByte2;
end
else raise Exception.Create('Text字符集设计有遗漏, 请通知开发人员!');
end;
end;
function Text_EncodeFromByte2(
var Source: TByteArray;
var SourceIndex: Integer;
var Buffer: TByteArray;
var BufferIndex: Integer;
var Byte1, Byte2, Byte3: Byte): TTriByteState;
begin
if Source[SourceIndex] in TextBasicSet then
begin
Byte3 := TextValue(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Inc(SourceIndex);
Result := tsReady;
end
else if Source[SourceIndex] in TextShift1Set then
begin
Byte3 := 0;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte1;
end
else if Source[SourceIndex] in TextShift2Set then
begin
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte1;
end
else if Source[SourceIndex] in TextShift3Set then
begin
Byte3 := 2;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := TextValue(Source[SourceIndex]);
Inc(SourceIndex);
Result := tsByte1;
end
else if Source[SourceIndex] > 127 then
begin
if (Source[SourceIndex] - 128) in TextBasicSet then
begin
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 30;
Byte2 := TextValue(Source[SourceIndex]);
Result := tsByte2;
end
else if (Source[SourceIndex] - 128) in TextShift1Set then
begin
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 30;
Byte2 := 0;
Byte3 := TextValue(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if (Source[SourceIndex] - 128) in TextShift2Set then
begin
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 30;
Byte2 := 1;
Byte3 := TextValue(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else if (Source[SourceIndex] - 128) in TextShift3Set then
begin
Byte3 := 1;
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Byte1 := 30;
Byte2 := 2;
Byte3 := TextValue(Source[SourceIndex]);
TriByteEncode(Byte1, Byte2, Byte3, Buffer[BufferIndex], Buffer[BufferIndex + 1]);
Inc(BufferIndex, 2);
Result := tsReady;
end
else raise Exception.Create('Text字符集设计有遗漏, 请通知开发人员!');
end;
end;
function Text_Encode(Shape: TECC200Shape; EncodeMode: TEncodeMode; var Source: TByteArray; var SourceIndex: Integer; var Buffer: TByteArray; var BufferIndex: Integer): TEncodeMode;
var
State: TTriByteState;
Byte1, Byte2, Byte3: Byte;
begin
State := tsReady;
while SourceIndex < Length(Source) do
begin
case State of
tsReady:
begin
Result := LookAhead(Source, SourceIndex, EncodeMode);
if Result <> EncodeMode then
begin
SwitchMode(Source, SourceIndex, Buffer, BufferIndex, EncodeMode, Result);
Exit;
end;
State := Text_EncodeFromReady(Source, SourceIndex, Buffer, BufferIndex, Byte1, Byte2, Byte3);
end;
tsByte1:
begin
State := Text_EncodeFromByte1(Source, SourceIndex, Buffer, BufferIndex, Byte1, Byte2, Byte3);
end;
tsByte2:
begin
State := Text_EncodeFromByte2(Source, SourceIndex, Buffer, BufferIndex, Byte1, Byte2, Byte3);
end;
end;
end;
case State of
tsReady:
begin
if not UpToBound(Shape, BufferIndex) then
begin
if NearestSize(Shape, BufferIndex) - BufferIndex > 1 then
begin
SwitchTriByteBack(Buffer, BufferIndex);
Result := emASCII;
Exit;
end;
end;
end;
tsByte1:
begin
case NearestSize(Shape, BufferIndex) - BufferIndex of
1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -