Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.11.2021, 02:40
Delphi_RTTI Delphi_RTTI вне форума
Прохожий
 
Регистрация: 30.11.2021
Адрес: Киев
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
Стрелка Перевод кода функции с языка С на Delphi

Всем привет!
Пожалуйста помогите с переводом :
Код:
int base45_decode(unsigned char * dst, 
                  size_t * _max_dst_len, 
                  const char * src, 
                  size_t src_len) 
{
  size_t out_len = 0, max_dst_len;
  max_dst_len = _max_dst_len  ? *_max_dst_len : src_len;

  if (dst == NULL && _max_dst_len == NULL)
	return -2;

  if (src == NULL)
	return -2;

  if (src_len == 0)
	src_len = strlen(src);

  for(int i = 0; i < src_len; i+=3) 
  {
     int x,a,b;

     if (src_len - i < 2) 
	return -1;

     if ((255 == (a = _C2I[src[i]])) || (255 == (b = _C2I[src[i+1]]))) 
	return -1;

     x = a + 45 * b;

     if (src_len - i >= 3) 
     {
        if (255 == (a = _C2I[src[i+2]])) 
	    return -1;

        x += a * 45 * 45;

        if (out_len < max_dst_len && dst)
        	dst[out_len] = x / 256;
        out_len++;
	x %= 256;
    };

    if (out_len < max_dst_len && dst)
        dst[out_len] = x;

    out_len++;
  };
  if (_max_dst_len)
	*_max_dst_len = out_len;

  return 0;
}

Последний раз редактировалось Admin, 30.11.2021 в 19:38.
Ответить с цитированием
  #2  
Старый 30.11.2021, 02:45
Delphi_RTTI Delphi_RTTI вне форума
Прохожий
 
Регистрация: 30.11.2021
Адрес: Киев
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Приблезительный перевод :
Код:
procedure Base45_Decode(const AInput, AOutput: TStream);
var
 ch, a, b: byte;
 x: word;
begin
 ch:= 0;
 repeat
  AInput.Read(ch, 1);
  a:= _C2I[ch];
  //
  AInput.Read(ch, 1);
  b:= _C2I[ch];
  //
  if (a = 255) or (b = 255) then exit;
  x:= a + 45 * b;
  //
  if AInput.Position < AInput.Size then
  begin
   AInput.Read(ch, 1);
   a:= _C2I[ch];
   //
   if a = 255 then exit;
   x:= x + (a * 45 * 45);
   //
   ch:= x shr 8;
   AOutput.Write(ch, 1);
  end;
  ch:= x and $FF;
  AOutput.Write(ch, 1);
 until AInput.Position = AInput.Size;
end;

"_C2I" содержит массив байт.
Процедура декодирует данные из
входного потока и записывает результат
в исходящий. Кто-нибудь может это скорректировать?

Последний раз редактировалось Admin, 30.11.2021 в 19:38.
Ответить с цитированием
  #3  
Старый 30.11.2021, 03:06
Delphi_RTTI Delphi_RTTI вне форума
Прохожий
 
Регистрация: 30.11.2021
Адрес: Киев
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Процедура из библиотеки "Base45",- используется при чтении/записи
Covid сертификатов. Близжайший аналог "Base64",
но с другим алгоритмом кодирования.
Код:
#include <ctype.h> 	// for size_t
#include <string.h> 	// for strlen()

/*                  Table 1: The Base 45 Alphabet
   Value Encoding  Value Encoding  Value Encoding  Value Encoding
      00 0            12 C            24 O            36 Space
      01 1            13 D            25 P            37 $
      02 2            14 E            26 Q            38 %
      03 3            15 F            27 R            39 *
      04 4            16 G            28 S            40 +
      05 5            17 H            29 T            41 -
      06 6            18 I            30 U            42 .
      07 7            19 J            31 V            43 /
      08 8            20 K            32 W            44 :
      09 9            21 L            33 X
      10 A            22 M            34 Y
      11 B            23 N            35 Z
*/

static const char BASE45_CHARSET[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";

static char _C2I[256] = {
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
	36, 255,255,255,  37, 38,255,255, 255,255, 39, 40, 255, 41, 42, 43,
         0,   1,  2,  3,   4,  5,  6,  7,   8,  9, 44,255, 255,255,255,255, 

        255, 10, 11, 12,  13, 14, 15, 16,  17, 18, 19, 20,  21, 22, 23, 24, /* uppercase */
         25, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 35, 255,255,255,255,
        255, 10, 11, 12,  13, 14, 15, 16,  17, 18, 19, 20,  21, 22, 23, 24, /* lowercase */
         25, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 35, 255,255,255,255,

	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,

	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
	255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
};

int base45_encode(char * dst, size_t *_max_dst_len, const unsigned char * src, size_t src_len) {
  size_t out_len = 0, max_dst_len;
  max_dst_len = _max_dst_len ? *_max_dst_len : src_len * 4;

  for(int i = 0; i < src_len; i+=2) {
     if (src_len - i > 1) {
        int x = ((src[i])<<8) + src[i+1];

        unsigned char e = x / (45 * 45);
        x %= 45 * 45;
        unsigned char d = x / 45;
        unsigned char c = x % 45;

	if (out_len < max_dst_len && dst)
		dst[ out_len ] = BASE45_CHARSET[c];
	out_len++;
	if (out_len < max_dst_len && dst)
		dst[ out_len ] = BASE45_CHARSET[d];
	out_len++;
	if (out_len < max_dst_len && dst)
		dst[ out_len ] = BASE45_CHARSET[e];
	out_len++;
     } else {
        int x = src[i];
        unsigned char d = x / 45;
        unsigned char c = x % 45;

	if (out_len < max_dst_len && dst)
		dst[ out_len ] = BASE45_CHARSET[c];
	out_len++;

	if (out_len < max_dst_len && dst)
		dst[ out_len ] = BASE45_CHARSET[d];
	out_len++;
     }
  }
  /* Same non guarantee as strncpy et.al. */
  if (out_len < max_dst_len && dst)
	dst[ out_len ] = 0;

  if (_max_dst_len)
	*_max_dst_len = out_len;
  return 0;
}

int base45_decode(unsigned char * dst, size_t * _max_dst_len, const char * src, size_t src_len) {
  size_t out_len = 0, max_dst_len;
  max_dst_len = _max_dst_len  ? *_max_dst_len : src_len;

  if (dst == NULL && _max_dst_len == NULL)
	return -2;

  if (src == NULL)
	return -2;

  if (src_len == 0)
	src_len = strlen(src);

  for(int i = 0; i < src_len; i+=3) {
     int x,a,b;

     if (src_len - i < 2) 
	return -1;

     if ((255 == (a = _C2I[src[i]])) || (255 == (b = _C2I[src[i+1]]))) 
	return -1;

     x = a + 45 * b;

     if (src_len - i >= 3) {
        if (255 == (a = _C2I[src[i+2]])) 
	    return -1;

        x += a * 45 * 45;

        if (out_len < max_dst_len && dst)
        	dst[out_len] = x / 256;
        out_len++;
	x %= 256;
    };

    if (out_len < max_dst_len && dst)
        dst[out_len] = x;

    out_len++;
  };
  if (_max_dst_len)
	*_max_dst_len = out_len;

  return 0;
}

#ifdef BASE45_UTIL
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv) {
	FILE * in = stdin;
	FILE * out = stdout;
	int decode = 0;
	int at  = 1;

	if (argc > 1 && argv[at][0] == '-') {
		if (argv[at][1] == 'd')
			decode = 1;
		else {
			fprintf(stderr,"Syntax: %s [-d] [infile [outfile]]\n", argv[0]);
			exit(1);
		};
		at++; argc--;
	};
	if (argc > 1) {
		if (NULL == (in = fopen(argv[at],"r"))) {
			perror("Cannot open input file for reading:");
			exit(1);
		};
		at++; argc--;
	};
	if (argc > 1) {
		if (NULL == (out = fopen(argv[at],"w"))) {
			perror("Cannot open out file for writing:");
			exit(1);
		};
		at++; argc--;
	};

#ifdef VALIDATE
	for(int i = 0; i < 45; i++) assert(i ==  _C2I[BASE45_CHARSET[i]]); 
#endif

        while(!feof(in)) {
        	unsigned char buff[       3 * 1024 ]; // multiple chosen to allow continuation.
        	unsigned char outbuf[ 3 * 3 * 1024 ];
		size_t olen = sizeof(outbuf);
		size_t len = fread(buff, 1, 3 * 1024, in);

		buff[len] = 0;

		if (len) {
			int e;
			if (decode) 
				e = base45_decode(outbuf, &olen, (char *) buff, len);
			else
				e = base45_encode((char *)outbuf, &olen, buff, len);

			if (e) {
				fprintf(stderr,"base45 %s failed\n", decode ? "decode" : "encode");
				exit(1);
			};

			if (olen)
				fwrite(outbuf, 1, olen, out);
		};
	}
	fclose(out);

	return(0);
};
#endif

Последний раз редактировалось Admin, 30.11.2021 в 19:39.
Ответить с цитированием
  #4  
Старый 07.12.2021, 18:45
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,070
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, добрые люди уже перевели. Стоит только поискать:
Код:
const
  _C2I: array [0..255] of byte = (
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    36, 255, 255, 255, 37, 38, 255, 255, 255, 255, 39, 40, 255, 41, 42, 43,
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, 255, 255, 255, 255, 255,

    255, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
    23, 24, (* uppercase *)
    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 , 35, 255, 255, 255, 255,
    255, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
    23, 24, (* lowercase *)
    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 255, 255, 255, 255,

    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255);


procedure base45_decode ( const AInput, AOutput: TStream);
var
  ch, a, b: byte;
  x: word;
begin
  ch: = 0;
  repeat
    AInput. Read (ch, 1);
    a: = _C2I [ch];

    AInput. Read (ch, 1);
    b: = _C2I [ch];

    if (a = 255) or (b = 255) then
      exit;

    x: = a + 45 * b;

    if AInput.Position <AInput.Size then
    begin
      AInput. Read (ch, 1);
      a: = _C2I [ch];

      if a = 255 then
        exit;
      x: = x + (a * 45 * 45);

      ch: = x shr 8;
      AOutput. Write (ch, 1);
    end ;
    ch: = x and $ FF;
    AOutput. Write (ch, 1);
  until AInput.Position = AInput.Size;
end ;

PS. Не проверял.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter