![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет!
Пожалуйста помогите с переводом : Код:
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
|
|||
|
|||
|
Приблезительный перевод :
Код:
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
|
|||
|
|||
|
Процедура из библиотеки "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
|
|||
|
|||
|
Вообще, добрые люди уже перевели. Стоит только поискать:
Код:
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. Не проверял. |