⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecc200.~pas

📁 delphi实现的二 维 码 生成 控制代 码
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
      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 + -