Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

В Base64 и обратно   Найти похожие ветки 

 
Юрий Зотов ©   (2006-11-14 15:29) [0]

Народ, подсобите, плиз, кто в курсе.

Срочно (вот прямо сейчас) нужны проверенные функции преобразования массива байт в Base64 и обратно.

Искал, нашел пару библиотечек, скачал, протестировал - глючат. В частности, из строки "123 Abc" после преобразования туда-обратно получаем строку "123 Ab".

Видать, пионерский самопал, верить им нельзя. А нужны проверенные и надежные.

Подкиньте ссылку, кто в курсе, плз. Спасибо.


 
Array ©   (2006-11-14 15:33) [1]

http://narod.yandex.ru/cgi-bin/yandmarkup?cluster=14&prog=0x2757571A&HndlQuery=161891856&PageNum=0&g=1&d=0&q0=1 186177648&p=


 
Romkin ©   (2006-11-14 15:35) [2]

Юра, у тебя хотя бы D6 есть? см IdCoder3To4.pas, оттуда IdBase64Encoder не подходит?


 
TUser ©   (2006-11-14 15:36) [3]

Тут примеры какие-то были
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=691


 
TUser ©   (2006-11-14 15:36) [4]

[3] не читать - ничего я не проверял.


 
Array ©   (2006-11-14 15:37) [5]

http://narod.yandex.ru/cgi-bin/yandmarkup?cluster=14&prog=0x2757571A&HndlQuery=161891856&PageNum=0&g=0&d=0&q0=1 186177648&p=

http://www.codenet.ru/progr/delphi/stat/AcedUtils.php


 
Eraser ©   (2006-11-14 15:38) [6]

> [0] Юрий Зотов ©   (14.11.06 15:29)

TIdEncoderMIME, TIdDecoderMIME из пакета Indy, думаю если покапаться во внутренностях, можно добыть именно ф-ции.


 
Jeer ©   (2006-11-14 15:38) [7]

{******************************************************************************* *******************}
{                                                                                                  }
{ Lightening fast Mime (Base64) Encoding and Decoding routines. Coded by Ralf Junker               }
{ (ralfjunker@gmx.de).                                                                             }
{                                                                                                  }
{ Unit owner: Marcel van Brakel                                                                    }
{ Last modified: January 29, 2001                                                                  }
{                                                                                                  }
{******************************************************************************* *******************}

unit JclMime;
interface
uses  Classes, SysUtils;

Устраивает ?


 
MBo ©   (2006-11-14 15:38) [8]

сам не тестировал

http://download.berlios.de/xrtl/XRTL-2004-11-22-0.11.zip
(в библиотеке есть модуль Base64)

http://www.swissdelphicenter.ch/en/showcode.php?id=1524
http://www.swissdelphicenter.ch/en/showcode.php?id=1223


 
Jeer ©   (2006-11-14 15:42) [9]

{                    Miscellaneous utility functions v3.31                     }
{                                                                              }
{      This unit is copyright й 2000-2003 by David Butler (david@e.co.za)      }
{                                                                              }
{                  This unit is part of Delphi Fundamentals.                   }
{                     Its original file name is cUtils.pas                     }
{                     It was generated 22 Jun 2003 09:55.                      }
{       The latest version is available from the Fundamentals home page        }
{                     http://fundementals.sourceforge.net/                     }

function  EncodeBase64(const S, Alphabet: String; const Pad: Boolean = False;
         const PadMultiple: Integer = 4; const PadChar: Char = "="): String;
function  DecodeBase64(const S, Alphabet: String; const PadSet: CharSet = []): String;


 
wal ©   (2006-11-14 15:46) [10]


> [2] Romkin ©   (14.11.06 15:35)
> [6] Eraser ©   (14.11.06 15:38)

У инди есть пара нюансов при декодировании:
1. длина входной строки должна быть кратна 4-м (что, в общем то, нормально, если на входе ПРАВИЛЬНАЯ строка), иначе исключение.
2. Если на входе попадется "неправильный" символ, на выходе получим $3F, вместо того, чтобы пропустить этот символ.

С уважением.


 
Percent   (2006-11-14 15:58) [11]

SZCodeBaseX 1.3.2

http://www.devarchive.com/f2647.html


 
Anatoly Podgoretsky ©   (2006-11-14 16:12) [12]

> Срочно (вот прямо сейчас)
Вот так прямо сейчас не могу, но можешь взять у меня на сайте мой NNTP сервер, там есть действительно проверенные. В отличии от большинства кривых. Они ввиде функций, так что вырезать не составит труда.


 
Anatoly Podgoretsky ©   (2006-11-14 16:13) [13]

Про другие, которые упоминают здесь я ничего не могу сказать ни плохого, ни хорошего, но знаю, что хороших (правильных) очень мало, остальные определенного рода поделки, которые дают не совсем верные результаты.


 
Anatoly Podgoretsky ©   (2006-11-14 16:15) [14]

> 1. длина входной строки должна быть кратна 4-м

Про подобные ошибки и есть речь, похоже авторы The Bat! используют именно ее. Им много лет говорят про ошибку, не реагируют.


 
Verg ©   (2006-11-14 17:10) [15]

begin 644 SynaCode.rar
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
MYRXU2GF2>015[ ##5&D`@@+/S&*B-,1&-8:$"@,N.M"->IJ>F8.,K[JRJX@V`
MKCXRS$P1=#/Q"-;"1Z$A([$\LJN)J&BH*!K,8(8(HS++[$:"H8R:L4^N;?.0
MH#):;2H+;L*$S&<CCAS1LMGH[3_$,-YDL-`:/($S&@TRB<<B&<NT\ERHXB@;
M2]I^)LYC$$]HX(Y;$V$OP^<IDLC-0"I/YIX(GB"ZV0".\<@Z=.6%E!"@*P1E
MU8I]>F><PTR!K21()8A%=9:D9>"0-9@/3-*VX2C%!#=C9EPW!"PT>IY*X6$Y
MS&Q..0F/2*&?[Y5E5PAOUVGX8)B%#7$&XW0:$*?#1B11X%^Q-+*KAB,8*+>U
M,7#$@I\C.0RECCBU8I];7YS1*9^`CIS1L9EX)PU`(4V:)E\])_0B#0J08(0R
MJ;>.6BA.M.$>6&C,+S>8&:@1$<KODB6&A6QTA&681:A;!R<1)C3)FD,\5%"B
M"-$RX<YI8`VPXT%_,;#&,QSFDI-C=ANU#.[M9ZKD-N7T)K!VBJWJJL]!X.B.
MO;#`)P,@?3)"C29F"%/C6;&$^!NPVSX$UY"6@(;=DKH605.P8?3\=,)\S%0L
MGR`)S<^0_"-"R)YR*2FF-RP,&)U(*#WB1&R&;*3`(-#"/(TAN$0W&C."963J
ML,>#9S[$V!L64E*.$R"141#!OF9AHHS,)I.9NN-V!A)DI)9D:5A^CX.5/(<R
M/$)(*69*4#,CJL,?F2DEI`9E:$I0*$=Q(4TF23O@F2E`S)JP,9&ZI)0@B)*1
M"E*!"U0W"U)*V2(["E5),!IF"P,I#@4DH4K%)2#<T),`-_G,S1*25]ML[RJI
M0+SDJK#)YB4A(2\Z2(%,A24@GL$F`%XDS@D`4FXXRI3K9C6!D$15(3"`K,L*
MV.=P0I.]T*4RDSJ3U,!F<D?C9L#&B.J0D&T4E(;RDE$.([*^I0(8-#<,I3H5
MWRP,AB@4A,959EA0;3ND9)^O!J8),`*00DI!M>YF^X2P,35W$E*9*S+0CQ"2
M,23)22S)3`88H[0GK`R*C)22S([@0E*!F34SF1XA*8#F1XA"588XRZI)2"E;
M0<$<DP!C@0PX$1#*13`;9I``;`R..!22Q%E853E2@0W#,S#:<"8:8R2D_&I0


 
Verg ©   (2006-11-14 17:10) [16]

M)G!9WDBBEC3LCBG3C-J=<@(>0LGD0SXC!(P^\^IH-Z:$,>3M1"Q(C49XW"?`
M2>!&6/)%=EC0I""I&QR$?D9)(,T:3`",^C@;JH(0GE04&3"D]$1J)$+&>!/=
M*6U`C+"DFA2PKLC8Y""I&22$?DHR/*0#\D0E)+,CL3ZG3AH2H!E&1Y%%(="B
M$?F@9U22E5!0#6=4H%Q$C95!"B(>!.Y30:,L@&/02QT\#A1YH9$<C5!"#=`(
M;4",FR%&6/)-BECCLC0Y"J=<"M*(@T1]D"3D81&"WHPFC1IH%1N4DKJ)0LIT
MX*3A,R1HP#JB1ECR3;LL<%(TJ"$"$-H@D1T:H*`40N:$1A]VGYH&MI,PXR92
M2NH@4^%2@841F.-2G8CY8\DX*6-NR%"-&GCP9)!/R49(E($W+<R4DLR.RH2E
M`O*=<)"W-(#RB1P23.C1ECR3CLL;%(5Z1I4%"B)4$)\2(\0^38RC#[N&1`EB
MYFTZB!R):&S"B$@/!Q"P#``G6]<^SO!L.6)@R>\-;W$"-BXN.K![P<KI>M:]
M#-OE6=J;:##SX,DO4<M>(.?;LL@O:K3H!3VN&Y^0.QOK0@;J(J>:;N[5F*"+
MMXL.#V6R6MR]56-O8.-2,_U\"Z5\_O^C]FK?C\<DZ??L,<O?653Q:.RR\=H`
M]<X?B$VF]1;XLT"LR>VYNWL?/RASF]?Z47+M2@?>QW_`P-75RR]/R]M^FL+O
M[/`N!L<>%-]G(0&*D$5>>GW^JO(&F7BN>^S(Z_R!@_L^W0D0>"T5AC#%1L^G
ME]21-Q56LZ,=ZKI4&@8ND8EL06C*3\QI$X>"U58O82K<EAE9S;TK-8Q$K3N;
MV3%OX0793IR7.Y]7<8[M#$\PYUJ[8"`QQGZK1W`9^*]P_SM*"Y;;-$RAO9[+
M5R>5<=L-)=C[33SKJJ.]*K%VVJUY=SP=SMQ".O[4EUX_/W2_T?0NVN*X&&"7
MS;@2*@?<4NR-9C][ #-W3@4\F"%14K]!Y0_K\"S!+PJ`_.#.BMI]VT$Z3TF=2
MU8D6=KSP!P3S?P^&][[FYBX[G%=6?U6%V/TC]74BG2Q!)?3G@(:(!W5G]Q=4
M(_\Q@6?,]R`"K%@E]&Q:\1%8[M2B_2G\7!W=G95T*JZ-5D1VRT"@E7?5VXH;
M7NYR=>4#^Z7%O$?&.[J^)N]OI1](2"M9#.R]V*:)6_X;"211./4FX4S/?Z;*
M[=;%(SQ=12MFO`+8*N4[^V7\00T(PZ1,V7I9,U86]!\$XGRX<=RR7NK6+4B.
M<I_`#^"I$>L,"M:I:RQ]=JWLA]:DR--TU9:VY#Z1>H/0SB=M;FBQ^WE8(#H0
M6PY>!2O$P6P7+1=[_(!FDE034K9=:T?["M8/Q"W++L27B"78EWJ=%U1:9EII
M%SJ"]81Q,GV;D9T*,T$G4+6A:/^::._9^^E?_?/>2^Q,H.?C2>UN)>V9!D?#
MB3UT<C(YIE#I2DN5+>#23%94>E+\3)/5TK/7_OGY9.R^$?UOQ\7?L>\Z79UU
MTFBW90[G/DZY__">R<LO:Y<7>#[H9SL<=_\6&4[1`MW3@#*+.G`5JM-<HINA
MZ50-ZK;9JK&RP2B*7$P`[G%4P9"8T7;P0Y38R,70XOU!O=0Y"\HY.D.98Q;.
MKNZ#RL>U7QQ%STL?QSX363VTCXZX^NF/Q8S[.K0?T$N[>F`,K(`S&L\GK$;&
MT)%>/4](^A^OY.YRL.O2$"3#?0-=:TG5H4]4>10VP)4R/J]Y%:A`=L2(6M>,
M6])LS5I(&N$O5Y=)4,^W(DOSR$6HLE:#?^"@FN>/#5QX5Z5?S\^1;]^^W"=Z
M1,NYW+`;.U"1RJR52&P%"NN<"-S3^@!0BTN\$%G&PD0*@DL1>^_DLMT[/WN&
MB^[;\@;M""=8\"VSIU,3%Y(=:P^^"JS-"K8[W>O^S!AQ7JD%8^%[,E<#TLGQ
M<^/)A]S&9;?56EYS*4-9[*[4J5?;9CEP%(W<^US5PMER<ONGBG30LX6X7?4$
MW/?7IT_OSQG1UW-SWV]01.HK7@"2]-+`LVG_4G;,J14ZMGMR`@7Q-.(0Q.DK
MX(<6;[^ER8M*AZE[6YCJ2[MRB<]<W!U;5U_DTM,S/L3:VP;>F]H#:[STZ<E4
MK5HZA_S@X.W"^//YY?CUQ^CL;ZM2P/I#[6N/&5>A\/\N>0I2/^O8F7;;/FL>
M:TUL_0,6MBU?^+OZPS[?TY_&_V>?MOK3]-];E0*L.GC6=<GE;^E/(W]"Z3M^
M.+88;+IRS%5U!*BY]V5H2BOI[M6Z6@M\FMVEF-\QYW[TF5]RXK"JGLG;JIYO
M/WF`*-7R[E?WX<5>4:<:"!X^E),K"PO,X)5FWJ"A/P^>KM53NM>?O6<@UUBH
M]">?57R[KG"U6Q);ROT-+8/5=V*\)VM``[%Z#+ZEC.=)PIBM=B:<!P-N67$C
M59B3ZNWF&.L]#(ZXPJI@W_!8(&W+_TYL6"BO<?.$Y_XX6@]G]7`3%/6GWOQ[
MY<J[30NVTXCO\O*J"5HQ`<E1?_I>W.2Y9C\H?M%4XVGW/SHQ.K"K3VH[71K-
M"BP16B,B"=VK>$"+VBC@A?,Z](21YTS\,$<4C,@Q,D:*XWTL;M94F_BX<&,,
MY?<I5)N?DKIFZ?=)>:"V`,=IBIE.&B?AU;V[H96?V*`.B#14A[]E[5WPYH*6
MZ"LTL:B9YM&%8\\]/1T7X;%9$SV^]W]":^%I<:=.?S!3L?PJ=Z\ZG;[GH5^?
MPN@[_W5"FQ4?F4^WYE4E?>JK?"?P"T$>/ZPLKNTL-_/;5OTB`$E^O4>5S\#[
M>>6>B7^!F7ZY]ZU\_3#V+^FKW\Z33P8<B6-/TD^\Y1?2)0=6"`>J^-9^ZZ9U
M`?BKLFV$_#,K38UN8Z"7*DK3!@[JDOORH/$$&WWRI\0D<N[5H"#":`I#"*8G
M8"#.)])[ #(L$)Q]@6B$E)"D$X*$TK7*-9+FDT9E,`S0P1)\2Z(N4=1(BS&-I
MR`4;\9]!J4@I5";(^C1;.7W61%;&R?1<7.F&>SS0AHT79C/5T710ZQF*]*73
M%+&KS;$_N&NQNG7I:,8>L)&,:Y3S0P0N&UG,<:["39GA4&$)K#5:.T<+SK@W
MF=929=CM]MQXK+L1]+28]>,43I-&9><+)TB4+G<V.(C2?1S#5HIDU4G79W@%
M1B9D/3?3#RP/JI*N4"-M1-/M*S,*L$S>5V!8LTC<#B?0S1`DYODI$NIT/4A@
MQ-0HT-)G<1"EIC:9UA(](HNOCB;=/I+L!1.0LQF@=/HKNN$HO"!#$VC17*,#
M++@G(6SZ&DW,6%H4+KFL)$O`^*TT_/&*%&CI.LOO1,Q/":Z](R+G5!%&^KR\
M?K$B7B0MN-QB)"\?1TH"CL)"RP.Z&JLX6SUK5D<8"6\GS(BV4V9J+K6=<<""
M6SD-8(ZUY!L/*_:H=(VU@G52;2T[(8FF74^CQ",S"K(.CY311/E+UZ2+E">U
M&,$;[TVCI:=C9C3\;%K*1KP`Z:#`\@X*;27:N(Z\9R*!OKTDTH<[[XR.1OGT
M5RA"6*-D3K1]%>.6(KKHX1-:PD;RY1>HSGNR]UZ1:3D$3<)GGHFM9:M7<?"&
M^1R"-W6$D7*4!7X&FVS],X47K9K>,I"B$4U=;*13T79U*R1^.-Y42,2P1UT@
M48(`3+Z@EJ4H\Z4#Z!Z>U62)!K!"72>#31FGH&>O21=G5V,4"0/$1I:<NM%T
M17(4:.E+JM.E:AA&?1TIKJ-]UR(L?7I"I,ZTTD@B;B%K"2:4\\%%.*R,NLI&
MNM<M%KHQOZRDFE&5<:9.G22Z)^QH67XR,M"T=+:S/PN0D-+#^U>!_$8/1Q;V
MA(_U_JJW556Z,`&N[5NR"+AI>Q)<@E[,RY#=ZFDF54__J:;FO21ZZDUHI"M$
M7".VAW)L)XICIJE`%NG>.UU(5(FURG([]7%K\^7K-\-H[/^4HP!FK?T*A>VN
MT<PO0Y9C?M<,5;"AZG:V/I"G%V)@E<HI685S?FC-VOM"BN\4G2<`+079U?9]
MK`NIX@+.`[\N]9!;*Q]=JSJYF/40!?M"[QX?QO*6<#`//R!XA5Z5#^I"+NUH
MQ.?C\5^)+^4(M_0(%JC>JI;JQW*#6:_%9@5E@C42[06ZN.#2DOVJ3[I>TQ,Y
MO5&JKG+LYTV^,?UPXTYVJ%*X7G/KI>-PZPP\ZZ0`=#KUKW*%&"_57=2ZYTO)
MN8,F>O\?&^6UR=/"?]E["DU/+,+/&=[_3._IX`S;L[8OGGG76D<9FE#3,YZK
MJ<%.<$?UMYV!7<HF=XWIW(_*I\/!8S]5Y@_Z?*KMMUV7A.3/E1Q6.5.*#8^N
MT"7^15Y]C#O4NPY^`4T$G82!Z.`(^0Q;XI3IBH-K&W;$VKV^[U9?!!G;8963
M52<NK#ESWK4O6NH]:T?JFM:[JK."1,.=)SCE3$E^6W5\S#4T=GYL>IOOL"#+
M?2^)3[![S%K=YZ1Y^VZ/9Q3>C#5)QHU0;:8J)E6`T+`SP#EQ"VDH?6O>T-:B
MK_-P\<X\*OZMV?8MKQ]<K//VI:!/NL+]^NA9I4K[N-I5]M6%FTTROR9-K0HL
MPZOONL!_QQ2@##K@?9A\)^*>IJVS\U(@*2U5X*4IO!44^NT5S/-46$`Q-A8[
MYAZ4%PR^RQUOL;023*^3?[^</Q_(:<[*5<,OMQ]D<4#[V?S?^T#$/7L`0`<`
`
end


 
antonn ©   (2006-11-14 18:43) [17]

<offtop>
и что интересно, никто не подтрунивает над автором, не посылают в гугл и ни слова о халяве...


 
Eraser ©   (2006-11-14 18:46) [18]

> [17] antonn ©   (14.11.06 18:43)

сначала человек работает на репутацию, потом репутация на человека (c) народная поговорка.


 
oldman ©   (2006-11-14 18:47) [19]


> antonn ©   (14.11.06 18:43) [17]


Ребята с большой буквой М вопросы типа "курсач горит" тута не задают...
В гугле он уже был.
Подтрутнивать над ним - ну его на фиг!
Халява - без комментариев...


 
Ketmar ©   (2006-11-14 20:09) [20]

>[17] antonn(c) 14-Nov-2006, 18:43
>и что интересно, никто не подтрунивает над автором
самоубийц нет. Юрий -- он добрый. но память у него тоже хорошая. %-)


 
Юрий Зотов ©   (2006-11-14 22:29) [21]

Всем огромное спасибо, вопрос был успешно и быстро решен.

> antonn ©   (14.11.06 18:43) [17]

Вы разве не знали? "Я страшный дракон Бойся-Бой!"
:о)

А насчет гугля - разве непонятно, что с него я и начал? Там такого добра - хоть ложкой ешь, только меня интересовали не глючные поделки юных пионэров, а надежный и быстрый профессиональный код. И как по-Вашему, сколько бы я потратил времени, отыскивая иголку в стоге сена? А времени-то как раз и не было.

Потому и спросил. Ведь наверняка многие уже юзали такие процедурки, поэтому легко могут поделиться собственным опытом. Типа "вот этим можешь смело пользоваться, а об этом вообще забудь".


 
Anatoly Podgoretsky ©   (2006-11-14 22:43) [22]

> Юрий Зотов  (14.11.2006 22:29:21)  [21]

Как решил, что именно взял, протестировал ли на граничных значениях 0, 1, 2 , 3, 4 символа?
Многие процедуры грешат. Я не зря про The Bat! говорил, если длина исходного не равна 3 трем символам, то потихоньку отжирает символы с конца. Точнее он делает неверные закодированые строки не равные 4 символам. А остальные продукты сжирают с конца, поскольку такую строку правильно не раскодировать.


 
Anatoly Podgoretsky ©   (2006-11-14 22:44) [23]

> Юрий Зотов  (14.11.2006 22:29:21)  [21]

Если что, то я сейчас дома и могу скопировать текст из ICS сюда.
Код автором выверен, хоть и не очень красивый (оптимальный).


 
Anatoly Podgoretsky ©   (2006-11-14 22:46) [24]

Второй автор за которого я могу поручиться это доктор Боб
Наверно слышал про такого, легендарная личность.


 
Johnmen ©   (2006-11-14 23:03) [25]


> Юрий Зотов ©   (14.11.06 22:29) [21]


Есть base64 от Sha ©. Очень быстрый.
Если всё ещё интересно, завтра поутру скину.


 
antonn ©   (2006-11-14 23:04) [26]

Юрий Зотов ©   (14.11.06 22:29) [21]
да ладно... :)
многие ищут правильный код поиска файлов по маске в поддиректориях (вот чтобы проверенный и правильный:)), ведь не все еще доросли до шифрования:) Ну, в итоге, их с гиканьем отправляют на F1, в гуглю и прочее:) Хотя, через бесчувственного гуглю довольно проблематично найти код, который проверенный, там всякого хлама полно:) Но это я поофтопил, нужно же было укусить)


 
Anatoly Podgoretsky ©   (2006-11-14 23:08) [27]

> antonn  (14.11.2006 23:04:26)  [26]

Интернет на 95% это помойка


 
antonn ©   (2006-11-14 23:35) [28]

Anatoly Podgoretsky ©   (14.11.06 23:08) [27]
я догадывался... :(


 
vuk ©   (2006-11-15 00:41) [29]

Я, помнится, реализовывал конвертирование из/в систем с различной длиной байта через потоки с побитовым чтением/записью.
Тогда перекодировка в BASE64 получается как чтение из исходного по 6 бит, перекодировка по таблице и запись в выходной поток. Обратно примерно так же, но наоборот - читается 8 бит перекодируется и пишется 6.


 
Юрий Зотов ©   (2006-11-15 00:55) [30]

> Johnmen ©   (14.11.06 23:03) [25]

Еще интересно, и даже очень. Там задача такова, что конвертировать придется, вполне возможно, мегабайтные куски, да еще и в достаточном количестве, поэтому скорость важна. А Александр - это тот человек, которому доверять стоит.

Так что был бы очень признателен Вам обоим.


 
Германн ©   (2006-11-15 04:04) [31]


> Юрий Зотов ©   (15.11.06 00:55) [30]
>
> > Johnmen ©   (14.11.06 23:03) [25]
>
> Еще интересно, и даже очень.

???_???


 
Anatoly Podgoretsky ©   (2006-11-15 09:56) [32]

> Германн  (15.11.2006 04:04:31)  [31]

Есть два человека Sha и Johnmen - вот им и будет благодарен


 
Johnmen ©   (2006-11-15 10:00) [33]


> Юрий Зотов ©   (15.11.06 00:55) [30]


Готов выслать на мыло. Моё - в анкете.


 
Johnmen ©   (2006-11-15 10:09) [34]

Выкладываю здесь. Взято из библиотеки Sha_Strings с согласия автора.


// (c) Sha 2003-2005

// Быстрые функции для преобразования бинарых данных в Base64-представление
// и обратно. Работают быстрее аналогов из Indy и ICS.
// Функции со строковым параметром возвращают преобразованную строку.
// Функции, работающие с буферами, возвращают количество полученных байтов.
// Sha_Base64Encode преобразует бинарную строку в Base64-строку или
// копирует (с преобразованием) данные из бинарного буфера в Base64-буфер.
function Sha_Base64Encode(const StringToEncode: string): string; overload;
function Sha_Base64Encode(BufToEncode, BufEncoded: pointer; LenToEncode: integer): integer; overload;
// Sha_Base64Decode преобразует Base64-строку в бинарную строку или
// копирует (с преобразованием) данные из Base64-буфера в бинарный буфер.
function Sha_Base64Decode(const StringToDecode: string): string; overload;
function Sha_Base64Decode(BufToDecode, BufDecoded: pointer; LenToDecode: integer): integer; overload;

// Sha_Base64Decode преобразует Base64-строку в бинарную строку.
function Sha_Base64Decode(const StringToDecode: string): string; overload;
type
 WordArray = array[0..$1fffffff] of word;
 pWordArray = ^WordArray;
var
 ch0, ch1: integer;
 p, q, terminator, lastdword: pChar;
label
 TestCrLf, Done, Error;
begin;
 ch0:=length(StringToDecode);
 if ch0>=4 then begin;
   SetLength(Result,ch0-(ch0 shr 2));
   p:=pointer(Result);
   q:=pointer(StringToDecode);
   terminator:=@q[ch0];
   lastdword:=@q[ch0-4];
   while true do begin;
     if q>lastdword then goto TestCrLf;
     ch0:=Base64Decode[ord(q[0])];
     if ch0>=64 then while true do begin;
       inc(q);
       if ch0>64 then goto Error;
TestCrLf:
       if q>=terminator then goto Done;
       ch0:=Base64Decode[ord(q[0])];
       if ch0<64 then begin;
          if q<=lastdword then break;
          if q>=terminator then goto Done;
          goto Error;
         end;
       end;

     ch1:=Base64Decode[ord(q[1])];
     if ch1>=64 then goto Error;
     p^:=chr((ch0 shl 2)+(ch1 shr 4)); inc(p);

     ch0:=pWordArray(q)[1];
     if ch0<>ord(Base64Nil)*(256+1) then begin;
       ch0:=Base64Decode[ch0 and 255];
       if ch0>=64 then goto Error;
       p^:=chr((ch1 shl 4)+(ch0 shr 2)); inc(p);

       ch1:=ord(q[3]);
       if ch1<>ord(Base64Nil) then begin;
         ch1:=Base64Decode[ch1];
         if ch1>=64 then goto Error;
         p^:=chr(ch0 shl 6 + ch1); inc(p);
         end;
       end;

     inc(q,4);
     end;
Done:
   SetLength(Result,p-pointer(Result));
   end
 else
Error:
   Result:="";
 end;

// Sha_Base64Decode копирует (с преобразованием) данные из Base64-буфера
// в бинарный буфер.
function Sha_Base64Decode(BufToDecode, BufDecoded: pointer; LenToDecode: integer): integer; overload;
type
 WordArray = array[0..$1fffffff] of word;
 pWordArray = ^WordArray;
var
 ch0, ch1: integer;
 p, q, terminator, lastdword: pChar;
label
 TestCrLf, Done, Error;
begin;
 if LenToDecode>=4 then begin;
   p:=BufDecoded;
   q:=pointer(BufToDecode);
   terminator:=@q[LenToDecode];
   lastdword:=@q[LenToDecode-4];
   while true do begin;
     if q>lastdword then goto TestCrLf;
     ch0:=Base64Decode[ord(q[0])];
     if ch0>=64 then while true do begin;
       inc(q);
       if ch0>64 then goto Error;
TestCrLf:
       if q>=terminator then goto Done;
       ch0:=Base64Decode[ord(q[0])];
       if ch0<64 then begin;
          if q<=lastdword then break;
          if q>=terminator then goto Done;
          goto Error;
         end;
       end;

     ch1:=Base64Decode[ord(q[1])];
     if ch1>=64 then goto Error;
     p^:=chr((ch0 shl 2)+(ch1 shr 4)); inc(p);

     ch0:=pWordArray(q)[1];
     if ch0<>ord(Base64Nil)*(256+1) then begin;
       ch0:=Base64Decode[ch0 and 255];
       if ch0>=64 then goto Error;
       p^:=chr((ch1 shl 4)+(ch0 shr 2)); inc(p);

       ch1:=ord(q[3]);
       if ch1<>ord(Base64Nil) then begin;
         ch1:=Base64Decode[ch1];
         if ch1>=64 then goto Error;
         p^:=chr(ch0 shl 6 + ch1); inc(p);
         end;
       end;

     inc(q,4);
     end;
Done:
   Result:=p-pChar(BufDecoded);
   end
 else
Error:
   Result:=0;
 end;


 
Юрий Зотов ©   (2006-11-15 10:42) [35]

> Johnmen ©   (15.11.06 10:09) [34]

Спасибище!


 
Johnmen ©   (2006-11-15 10:50) [36]

Продолжение, т.е. начало...


const
 Base64Nil = "=";
 Base64Encode: array [0..63] of char = (
   "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
   "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
   "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
   "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
   "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
 Base64Decode: array[0..255] of byte = (
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 64, 99, 99, 64, 99, 99, //"64" for #10,#13
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, //"99" for not Base64 codes
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 62, 99, 99, 99, 63, //"62" for "+", "63" for "/"
   52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 99, 99, 99, 99, 99, 99,
   99,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
   15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 99, 99, 99, 99, 99,
   99, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
   41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99);

// Sha_Base64Encode преобразует бинарную строку в Base64-строку.
function Sha_Base64Encode(const StringToEncode: string): string; overload;
var
 len, ch0, ch1: integer;
 p, q: pChar;
begin;
 p:=pointer(StringToEncode);
 len:=length(StringToEncode);
 ch0:=((len+2) div 3) * 4;
 Setlength(Result,ch0);
 if ch0>0 then begin;
   q:=pointer(Result);
   pInteger(@q[ch0-4])^:=ord(Base64Nil)*$01010101;
   repeat;
     ch0:=Ord(p[0]);
     q[0]:=Base64Encode[ch0 shr 2];
     ch0:=(ch0 and $03) shl 4;
     if len<=1 then
       q[1]:=Base64Encode[ch0]
     else begin;
       ch1:=Ord(p[1]);
       q[1]:=Base64Encode[ch0 + (ch1 shr 4)];
       ch1:=(ch1 and $0F); ch1:=ch1+ch1; ch1:=ch1+ch1;
       if len<=2 then
         q[2]:=Base64Encode[ch1]
       else begin;
         ch0:=Ord(p[2]);
         q[2]:=Base64Encode[ch1 + (ch0 shr 6)];
         q[3]:=Base64Encode[ch0 and $3F];
         end;
       end;
     len:=len-3;
     p:=p+3;
     q:=q+4;
     until len<=0;
   end;
 end;

// Sha_Base64Encode копирует (с преобразованием) данные из бинарного буфера
// в Base64-буфер.
function Sha_Base64Encode(BufToEncode, BufEncoded: pointer; LenToEncode: integer): integer; overload;
var
 ch0, ch1: integer;
 p, q: pChar;
begin;
 p:=BufToEncode;
 Result:=((LenToEncode+2) div 3) * 4;
 if Result>0 then begin;
   q:=BufEncoded;
   pInteger(@q[Result-4])^:=ord(Base64Nil)*$01010101;
   repeat;
     ch0:=Ord(p[0]);
     q[0]:=Base64Encode[ch0 shr 2];
     ch0:=(ch0 and $03) shl 4;
     if LenToEncode<=1 then
       q[1]:=Base64Encode[ch0]
     else begin;
       ch1:=Ord(p[1]);
       q[1]:=Base64Encode[ch0 + (ch1 shr 4)];
       ch1:=(ch1 and $0F); ch1:=ch1+ch1; ch1:=ch1+ch1;
       if LenToEncode<=2 then
         q[2]:=Base64Encode[ch1]
       else begin;
         ch0:=Ord(p[2]);
         q[2]:=Base64Encode[ch1 + (ch0 shr 6)];
         q[3]:=Base64Encode[ch0 and $3F];
         end;
       end;
     LenToEncode:=LenToEncode-3;
     p:=p+3;
     q:=q+4;
     until LenToEncode<=0;
   end;
 end;


 
Styx_   (2006-11-15 11:09) [37]

Что-то я не пойму, откуда наезды на IDEncoderMIME... Только что закодировал из потока файлы размером 1, 2, 3 и 4 байта, отправил на сервер, там раскодировал встроенной функцией PHP - всё нормально. Delphi 7. Что я делаю не так?


 
Percent   (2006-11-15 11:29) [38]

А! Goto! А!!! *упал в обморок*


 
Юрий Зотов ©   (2006-11-15 12:30) [39]

> Percent   (15.11.06 11:29) [38]

Это от снобизма. Ничего, пройдет.


 
Anatoly Podgoretsky ©   (2006-11-15 14:04) [40]

> Styx_  (15.11.2006 11:09:37)  [37]

Ну например не приводишь эти закодированые строчки здесь.
Потом Инди - это уже 10!!! версий


 
Anatoly Podgoretsky ©   (2006-11-15 14:05) [41]

> Юрий Зотов  (15.11.2006 12:30:39)  [39]

А может съел что ни будь?


 
Styx_   (2006-11-15 16:24) [42]


> Anatoly Podgoretsky ©   (15.11.06 14:04) [40]


Internet Direct (Indy) for Run-Time Package for Delphi 7
FileVersion 9.00.0.03
Copyright © 1993 - 2002 Chad Z. Hower (Kudzu) and the Indy Pit Crew

а -> oA==
аб -> oKE=
абв -> oKGi
абвг -> oKGiow==


 
Sha ©   (2006-11-15 16:40) [43]

> Percent   (15.11.06 11:29) [38]

Напишешь быстрее без GOTO - признАю, что был не прав )))


 
Anatoly Podgoretsky ©   (2006-11-15 16:45) [44]

> Styx_  (15.11.2006 16:24:42)  [42]

Вот теперь можно одназначно говорить, в реализации проблемы нет.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.051 c
3-1159550644
Kley
2006-09-29 21:24
2006.12.03
Exel&amp;Delphi


4-1153475730
kleem
2006-07-21 13:55
2006.12.03
Сделать окно активным


2-1163602406
maxXP
2006-11-15 17:53
2006.12.03
Выделение целой строки StringGrid


15-1163270446
Cyrax spectre
2006-11-11 21:40
2006.12.03
Имею ли я право на реабилитацию или УДО ?


2-1163532574
Ruffian
2006-11-14 22:29
2006.12.03
Всё таже работа с файлами...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский