• puto unicode en delphi 7

 #486990  por joselin
 21 Jun 2016, 09:57
el unico codigo base64 utf16 que encontre [ Debe registrarse para ver este enlace ]
me tiraba unos caracteres diferentes al codificar
asi que a prueba y error quedo funcional en delphi 7
las 2 peronas del subforo delphi que entienden en este tema,
me corrijan si cometi una burrada
unit Unit2;

//unit untComBase64;
 
{SHL realiza un corrimiento de los bits del primer
operando hacia la izquierda (SHift Left),
 inyectando ceros por la derecha. Se desplazan
 tantos bits como se indique en el segundo operando. Ejemplo:
var 
a: byte; 
begin 
a := $57; // 01010111 
a := a shl 1; // 10101110 
a := a shl 2; // 10111000 
..... 
SHR es como SHL, pero el corrimiento
curre hacia la derecha, inyectándose ceros por la izquierda. }
 
interface
 
uses SysUtils,dialogs;
 
function encode64(s: string): string;
function decode64(s: string): string;
 
implementation
 
const
  tabChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  
function encode64(s: string): string;
var
  i       : Integer; // compteur
  charCode: Integer; // code du caract?re dans la table Unicode
  valToDec: Integer; // valeur ? d?cr?menter au fur ? mesure de la conversion
  nbrBits : Integer; // nombre de bits actuellement dans vaToDec (maximum 16 + 4)
  charPos : Integer; // position dans le tableau de codage en base64
begin
  Result   := '';
  charCode := 0;
  nbrBits  := 0;
  valToDec := 0;
 
  //parcours des caract?res
  
  for i := 1 to (Length(s)) do
  begin
  ///aca esta la magia resolver
     //multiplicar por 4
     //http://docwiki.embarcadero.com/RADStudio/Seattle/en/String_Types_(Delphi)

    charCode := (Ord(s[i])*4);



    nbrBits  := nbrBits + 16;
    valToDec := (valToDec shl 16) + charCode;


    // traiter les bits tant que l'on sais faire des groupements de 6
    // Procesar los bits como se le conoce a grupos de 6
    while (nbrBits - 6) >=0  do
    begin
      nbrBits  := (nbrBits - 6);
      charPos  := (valToDec shr (nbrBits ));

      //
      valToDec := valToDec - (charPos shl nbrBits);
      Result   := Result + tabChar[charPos + 1];



    end;

  end;
   //EN ESTA PARTE HABRIA QUE COLOCAR EL PRIMER CARACTER AL FINAL
   //y deletearlo

    result:=result+ (copy(result,0,1));
     delete(result,1,1);
    showmessage(result);

  // gestion des desniers bits + ajout des compl?ments
  if nbrBits > 0 then
  begin
    charPos := valToDec shl (6 - nbrBits);

    Result  := Result + tabChar[charPos + 1];

    for i := 1 to (6 - nbrBits) div 2 do
      Result := Result + '=';
  end;
end;
 #487005  por crack81
 22 Jun 2016, 04:04
Hola @joselin como has estado espero bien
Actualmente ya no trabajo en Delphi he migrado a lazarus pero al final es practicamente lo mismo.
Respecto a tu pregunta probé el algoritmo y claro cifra y descifra pero su resultado no parece el correcto lo compare con otros algoritmos de cifrado en internet y genera un cifrado totalmente distinto

En lo personal me gusta mas este algoritmo el cual hasta ahora me ha dado muy buenos resultados
[ Debe registrarse para ver este enlace ]
Ademas que concuerda con varios sitios web como estos

[ Debe registrarse para ver este enlace ]
[ Debe registrarse para ver este enlace ]

Recalco las pruebas las hice en lazarus 1.6 y en lo personal me anduvo bien
var
  encrypted:string; source:String;
begin

  source:=AnsiString('我是中国人 - Я китайский - Avión'); //chino - ruso - acento


  encrypted:=EncodeBase64(source);
  WriteLn(encrypted);

  source:=DecodeBase64(encrypted);
  WriteLn(source);


Saludos....
 #487007  por joselin
 22 Jun 2016, 08:38
pero cuando codificas con powershell en utf16 me da este valor
$b = [System.Text.Encoding]::UNICODE.GetBytes("papanicolao1981")
[System.Convert]::ToBase64String($b)

cABhAHAAYQBuAGkAYwBvAGwAYQBvADEAOQA4ADEA

y con tu metodo es diferente
cGFwYW5pY29sYW8xOTgx
 #487020  por crack81
 22 Jun 2016, 18:41
Claro ya que la codificacion que hago es en utf8 y la que tu dices es en utf16
prueba con esta web [ Debe registrarse para ver este enlace ] y si codificas con utf32 tambien da un valor distinto.
Ya seria cuestion tuya saber cual codificacion quieres, pero aun asi el codigo que publicaste no conicide ni con utf8,utf16 o utf32
 #487022  por joselin
 22 Jun 2016, 19:22
solo funciona en delphi 7
otros ides superiores ya trabajan unicode
delphi 7 es obsoleto debe ser eso
o quisas es cierto y solo me funciona de milagro en mi DELPHI7
 #487023  por crack81
 22 Jun 2016, 19:42
Pues si seria recomendable migrar a un delphi mas nuevo hace tiempo probe delphi 2010 y me anduvo de perlas, las ultimas versiones de delphi son demasiado pesadas y claro siempre tienes la chance de probar lazarus el cual es unicode nativo ya lo miras tu.
Saludos....