Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2023
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 261
Poder: 21
Carmelo Cash Va por buen camino
Buen día:

Gracias por responder.

lo que no sé como hacer es :

"Codificar ese JSON en base64"
Responder Con Cita
  #2  
Antiguo 20-09-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo utilizo una unidad que utiliza las librerías de windows para hacer eso...
Pasa de Stream a string y el string está codificado en Base64
También decodifica.

Para utilizarlo con un string -> string deberás crear un TMemoryStream de la cadena (JSON) y pasárselo.

Código Delphi [-]
const
  CRYPT_STRING_BASE64 = 1;

function CryptBinaryToString(pbBinary: PByte; cbBinary: DWORD; dwFlags: DWORD; pszString: PChar; var pcchString: DWORD): BOOL; stdcall;
  external 'Crypt32.dll' Name 'CryptBinaryToStringA';

function CryptStringToBinary(pszString: PChar; cchString: DWORD; dwFlags: DWORD; pbBinary: PByte; var pcbBinary: DWORD; pdwSkip: PDWORD; pdwFlags: PDWORD): BOOL; stdcall;
  external 'Crypt32.dll' Name 'CryptStringToBinaryA';

//---------------------------------------------------------------------------
// Codifica un TMemoryStrean a cadena Encode64
function StreamToStrB64(MStream: TMemoryStream; var Str: string): boolean;
var
  Size : DWORD;
begin
  Result := CryptBinaryToString(MStream.Memory, MStream.Size, CRYPT_STRING_BASE64, 0, Size);
  if Result then
  begin
     SetLength(Str, Size);
     Result := CryptBinaryToString(MStream.Memory, MStream.Size, CRYPT_STRING_BASE64, @Str[1], Size);
  end;
end;

//---------------------------------------------------------------------------
// Decodifica una cadena Encode64 a su binario original en un TMemoryStream
function StrB64ToStream(var Str: string; MStream: TMemoryStream): boolean;
var
  Size : DWORD;
begin
  Result := CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, 0, Size, nil, nil);
  if Result then
  begin
     MStream.SetSize(Size);
     Result := CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, MStream.Memory, Size, nil, nil);
  end;
end;
Responder Con Cita
  #3  
Antiguo 20-09-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Un ejemplo de utilización completa sería:

Código Delphi [-]
procedure TFMPruebas.BBase64Click(Sender: TObject);
var
  strJSON, strBase64 : string;
  StreamOrigen, AMemoryStream : TStream;
  QR : TImage;
begin
   inherited;

   // String JSON de ejemplo
   strJSON := '{"ver":1,"fecha":"2020-10-13","cuit":30000000007,"ptoVta":10,"tipoCmp":1,"nroCmp":94,"importe":12100,"moneda":"DOL","ctz":65,"  tipoDocRec":80,"nroDocRec":20000000001,"tipoCodAut":"E","codAut":70417054367476}';

   // Cargo JSON en un Stream
   StreamOrigen := TStringStream.Create(strJSON);
   AMemoryStream := TMemoryStream.Create;
   QR := TImage.Create(Self);
   try
      AMemoryStream.CopyFrom(StreamOrigen, StreamOrigen.Size);
      // Convierto a Base64
      StreamToStrB64(TMemoryStream(AMemoryStream), strBase64);

      // Creo imagen con código QR de string Base64
      CrearCodigoQR(QR.Picture.Bitmap, strBase64, 3);
   finally
      StreamOrigen.Free;
      AMemoryStream.Free;
      QR.Free;
   end;
end;

Última edición por duilioisola fecha: 20-09-2023 a las 15:49:19.
Responder Con Cita
  #4  
Antiguo 21-09-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Carmelo Cash Ver Mensaje
"Codificar ese JSON en base64"

Ya te han puesto ejemplos.
En la docwiki de embarcadero tienes información de cómo hacerlo. Las versiones nueva ya incluyen lo necesario para hacerlo.
https://docwiki.embarcadero.com/Libr...coding_Methods

Esta clase: System.NetEncoding.TBase64Encoding se describe como:
Provides methods to encode and decode data in base64 format.

Posee métodos de clase que puedes llamar directamente.
Y algún ejemplos:

For example:

Encode('Example') returns 'RXhhbXBsZQ=='.
Decode('RXhhbXBsZQ==') returns 'Example'.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 25-09-2023
Avatar de Carmelo Cash
Carmelo Cash Carmelo Cash is offline
Miembro
 
Registrado: jul 2003
Ubicación: Buenos Aires
Posts: 261
Poder: 21
Carmelo Cash Va por buen camino
Casi Casi

Buenos días:

Estoy probando la función que pasó duilioisola.


El tema es que codifica bien hasta la posición 164, luego comienzan las diferencias..



esto debería dar:

eyJ2ZXIiOjEsImZlY2hhIjoiMjAyMC0xMC0xMyIsImN1aXQiOjMwMDAwMDAwMDA3LCJwdG9WdGEiOjEwLCJ0aXBvQ21wIjoxLCJu cm9DbXAiOjk0LCJpbXBvcnRlIjoxMjEwMCwibW9uZWRhIjoiRE9MIiwiY3R6Ijo2NSwidGlwb0RvY1JlYyI6ODAsIm5yb0RvY1Jl YyI6MjAwMDAwMDAwMDEsInRpcG9Db2RBdXQiOiJFIiwiY29kQXV0Ijo3MDQxNzA1NDM2NzQ3Nn0

esto da:

eyJ2ZXIiOjEsImZlY2hhIjoiMjAyMC0xMC0xMyIsImN1aXQiOjMwMDAwMDAwMDA3
LCJwdG9WdGEiOjEwLCJ0aXBvQ21wIjoxLCJucm9DbXAiOjk0LCJpbXBvcnRlIjox
MjEwMCwibW9uZWRhIjoiRE9MIiwiY3R6Ijo2NSwiIHRpcG9Eb2NSZWMiOjgwLCJu
cm9Eb2NSZWMiOjIwMDAwMDAwMDAxLCJ0aXBvQ29kQXV0IjoiRSIsImNvZEF1dCI6
NzA0MTcwNTQzNjc0NzZ9
Responder Con Cita
  #6  
Antiguo 25-09-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Me sucedió lo mismo con el ejemplo que enviaste...
El problema era que había un espacio de más...

En el ejemplo que escribí hay espacios de más:
Código Delphi [-]
   strJSON := '{"ver":1,"fecha":"2020-10-13","cuit":30000000007,"ptoVta":10,"tipoCmp":1,"nroCmp":94,"importe":12100,"moneda":"DOL","ctz":65  ,"  TipoDocRec":80,"nroDocRec":20000000001,"tipoCodAut":"E","codAut":70417054367476}';
Mira :"ctz":65,"__tipoDocRec":80,"nroDocRec":

Si corriges esto la conversión a Base 64 es correcta.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Factura Electronica - Afip Argentina Joe_Balda Varios 30 30-01-2021 04:10:34
Constancia de Inscripcion AFIP argentina adripugliesso Varios 1 13-07-2017 21:00:11
AFIP Argentina: Consultas al padron de contribuyentes AgustinOrtu Bibliotecas de código fuente 18 28-06-2017 03:04:38
Factura Electrónica AFIP Argentina SergioFrey Noticias 2 19-05-2017 21:02:03
Ayuda Web Service AFIP Argentina patriciojgf Delphi para la web 1 04-11-2014 17:46:34


La franja horaria es GMT +2. Ahora son las 06:57:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi