Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2008, 13:33   #11
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
3) в вышеуказанном коде покажите, как можно получить символы '4' '5' и т.д. из области памяти, на которую указывает p (PChar - это же указатель)...
Ну к примеру если
Код:
var   
  p : PChar;   
begin   
  p := '123'#0'456789';   
  // = 4
  inc(p, 4);
  p^ = '4';
end;
ну я так с потолка... к примеру )) разве проблема ?
есть еще такие вещи как приобразование типов к примеру
Код:
  // = 4
  PCHAR(Integer(p) + 4)^;
Никак да ? Я же говорю... просто представление еще о данных у вас немного не то, ну ниче потом поймете
BOBAH13 вне форума Ответить с цитированием
Старый 29.08.2008, 13:44   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

BOBAH13, приношу свои глубочайшие извинения.
Я БЫЛ НЕПРАВ! :-(
Погонял немного в отладчике - действительно, в памяти всё есть. Просто стандартные процедуры доступа (null-terminated) выдают данные до первого нуля. Если работать через указатели - всё есть.

p.s. но всё равно остаюсь при своём мнении насчёт решения задачи топика...Ну не вижу я необходимости использовать PChar там, где лучше использовать Pointer!
А, в данном случае, лучше использовать просто массив!Не надо плодить сущностей сверх необходимости... ;-)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.08.2008, 15:55   #13
furstenberg
Форумчанин
 
Регистрация: 08.10.2007
Сообщений: 125
По умолчанию

Всем спасибо, сделал через массив
furstenberg вне форума Ответить с цитированием
Старый 29.08.2008, 17:02   #14
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Как не удивительно по работе, пришлось самому реализовать так же буфер. Вот что я поддразумивал когда говорил сделать через PChar
Вроде работает нормально.

Код:
unit Base64;

interface

  function GetEncodeLen(Len: Integer): Integer;
  function GetDecodeLen(Value: PCHAR; Len: Integer): Integer;

  procedure EncodeBase64(Src, Dest: PChar; Len: Integer);
  procedure DecodeBase64(Src, Dest: PChar; Len: Integer);

  function EncodeBase64Str(Value: String): String;
  function DecodeBase64Str(Value: String): String;

implementation

const
  Char64: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

procedure EncodeBase64(Src, Dest: PChar; Len: Integer);

  procedure EncodeChunk(Src, Dest: PChar; Len: Integer);
  var
    W: LongWord;
    i: Byte;
  begin
    W := 0;
    for i := 0 to Len - 1 do
    begin
      W := W + Ord(Src^) shl ((2 - i) * 8);
      inc(Src);
    end;

    Dest^ := Char64[(W shr 18) and $3f]; inc(Dest);
    Dest^ := Char64[(W shr 12) and $3f]; inc(Dest);
    Dest^ := Char64[(W shr 06) and $3f]; inc(Dest);
    Dest^ := Char64[(W shr 00) and $3f]; inc(Dest);
    
    if (Len < 3) then
    begin
      dec(Dest, 3 - Len);
      for i:= 1 to 3 - Len do
      begin
        Dest^ := '=';
        inc(Dest);
      end;   
    end;
  end;

begin
  while True do
  if (Len > 3) then
  begin
    EncodeChunk(Src, Dest, 3);
    inc(Src, 3);
    inc(Dest, 4);
    dec(Len, 3);
  end else
  begin
    EncodeChunk(Src, Dest, Len);
    Break;
  end;
end;

procedure DecodeBase64(Src, Dest: PChar; Len: Integer);

  procedure DecodeChunk(Src, Dest: PChar);
  var
    W: LongWord;
    i: Byte;
  begin
    W := 0;
    for i := 1 to 4 do
    begin
      if (Pos(Src^, Char64) > 0) then
        W := W + Word((Pos(Src^, Char64) - 1)) shl ((4 - i) * 6);
      inc(Src);
    end;
    for i := 1 to 3 do
    begin
      Dest^ := Chr(W shr ((3 - i) * 8) and $ff);
      inc(Dest);
    end;
  end;
  
begin
  if (Len mod 4 > 0) then Exit;
  while (Len > 0) do
  begin
    DecodeChunk(Src, Dest);
    inc(Src, 4);
    inc(Dest, 3);
    dec(Len, 4);
  end;
end;

function GetEncodeLen(Len: Integer): Integer;
begin
  Result := (Len div 3) * 4;
  if (Len mod 3 > 0) then
    inc(Result, 4);
end;

function GetDecodeLen(Value: PCHAR; Len: Integer): Integer;
var
  i: Integer;
begin
  Result := Len - (Len div 4);
  if (Len > 3) then
  for i:= Len downto Len - 3 do
  if (PCHAR(Integer(Value) + i)^ = '=') then dec(Result);
end;

function EncodeBase64Str(Value: String): String;
begin;
  SetLength(Result, GetEncodeLen(Length(Value)));
  EncodeBase64(PCHAR(Value), PCHAR(Result), Length(Value));
end;

function DecodeBase64Str(Value: String): String;
begin
  SetLength(Result, GetDecodeLen(PCHAR(Value), Length(Value)));
  DecodeBase64(PCHAR(Value), PCHAR(Result), Length(Value));
end;

end.

Последний раз редактировалось BOBAH13; 29.08.2008 в 17:07.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
base64 BlackOmen Общие вопросы Delphi 2 02.05.2008 16:30