none
Byte array a xml con codificación UTF8 y base64? RRS feed

  • Pregunta

  • Necesito convertir mi xml firmado en codificación UTF8 y base 64 y pasarselo como byte[] a un WS

    // Save the document. xml firmado
                    xmlDoc.Save(@"D:\\test-signed.xml");
                    //convertir a byte
                    byte[] arrayDeBytes = System.IO.File.ReadAllBytes(@"D:\\test-signed.xml");
                    //convertir a string
                    var codificado = Convert.ToBase64String(arrayDeBytes);
                    
                    byte[] archivo64 = Convert.FromBase64String(codificado);
    
                    var respuesta = _validarFactura.ConsultarRecepcion(archivo64);

    ¿Que es lo que me faltaría para que este codificado en UTF8 y base 64?

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 7 de enero de 2019 6:05

Respuestas

  • Primero, pasa pasarlo a UTF8:

    Si tu archivo en disco ya está en UTF8, entonces basta con usar el File.ReadAllBytes como ya estás haciendo:

    byte[] arrayDeBytes = System.IO.File.ReadAllBytes(@"D:\\test-signed.xml");

    Si no está en UTF8, necesitas saber cuál es su codificación actual para poderlo convertir a UTF8. Por ejemplo, si está en Windows ANSI, primero lo lees a un string usando ese formato, y luego lo pasas a UTF8 usando System.Text.Encoding:

    string texto = System.IO.File.ReadAllText(@"d:\\tuArchivo.xml", System.Text.Encoding.GetEncoding(1252));

    byte[] arrayDeBytes = System.Text.Encoding.UTF8.GetBytes(texto);

    Obviamente, el 1252 del ejemplo anterior tendrás que sustituirlo por la codificación que realmente tenga tu archivo, que es necesario conocer de antemano, no se puede determinar de manera automática.

    Una vez que ya tienes los bytes, para pasarlos a base 64 se usa el Convert.ToBase64String como ya estás haciendo:

    var codificado = Convert.ToBase64String(arrayDeBytes);

    Eso YA ES el resultado deseado en base64. Base64 es un string. Si lo vuelves a convertir a bytes (como haces en tu ejemplo) entonces deja de ser base64.


    lunes, 7 de enero de 2019 7:37
    Moderador
  • Entonces el parámetro que le paso al WS es un string y no un byte[]?

    Sí, si te han pedido que pases el dato en Base64 es porque esperan un String. Precisamente el base64 sirve para eso, para poder pasar en forma de texto algo que de lo contrario sería binario. Si el WS admitiese pasarle un byte[], entonces no sería razonable que se hablase de Base64; bastaría con pasar directamente los bytes sin necesidad de codificarlos en base64.
    • Marcado como respuesta Pedro Ávila lunes, 7 de enero de 2019 18:57
    lunes, 7 de enero de 2019 18:48
    Moderador

Todas las respuestas

  • Primero, pasa pasarlo a UTF8:

    Si tu archivo en disco ya está en UTF8, entonces basta con usar el File.ReadAllBytes como ya estás haciendo:

    byte[] arrayDeBytes = System.IO.File.ReadAllBytes(@"D:\\test-signed.xml");

    Si no está en UTF8, necesitas saber cuál es su codificación actual para poderlo convertir a UTF8. Por ejemplo, si está en Windows ANSI, primero lo lees a un string usando ese formato, y luego lo pasas a UTF8 usando System.Text.Encoding:

    string texto = System.IO.File.ReadAllText(@"d:\\tuArchivo.xml", System.Text.Encoding.GetEncoding(1252));

    byte[] arrayDeBytes = System.Text.Encoding.UTF8.GetBytes(texto);

    Obviamente, el 1252 del ejemplo anterior tendrás que sustituirlo por la codificación que realmente tenga tu archivo, que es necesario conocer de antemano, no se puede determinar de manera automática.

    Una vez que ya tienes los bytes, para pasarlos a base 64 se usa el Convert.ToBase64String como ya estás haciendo:

    var codificado = Convert.ToBase64String(arrayDeBytes);

    Eso YA ES el resultado deseado en base64. Base64 es un string. Si lo vuelves a convertir a bytes (como haces en tu ejemplo) entonces deja de ser base64.


    lunes, 7 de enero de 2019 7:37
    Moderador
  • porque haces dos veces la misma pregunta

    Como agregar mandar parámetros a servicio web xml



    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 7 de enero de 2019 11:09
  • Hola Leandro

    porque haces dos veces la misma pregunta

    Como agregar mandar parámetros a servicio web xml

    Son preguntas diferentes en este hilo pregunto como convertir xml a UTF8 y base 64

    Y en la otra pregunta que haces referencia en este hilo pregunto si es que debo de enviarle dos parámetros o uno solo.....

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 7 de enero de 2019 14:32
  • Hola @Alberto

    Si tu archivo en disco ya está en UTF8, entonces basta con usar el File.ReadAllBytes como ya estás haciendo:

    byte[] arrayDeBytes = System.IO.File.ReadAllBytes(@"D:\\test-signed.xml");

    Si ya lo tengo en UTF8

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>


    Una vez que ya tienes los bytes, para pasarlos a base 64 se usa el Convert.ToBase64String como ya estás haciendo:

    var codificado = Convert.ToBase64String(arrayDeBytes);

    Entonces el parámetro que le paso al WS es un string y no un byte[]?

    @WebMethod
    @WebResult(name = "RespuestaRecepcionComprobante")
    public RespuestaSolicitud validarComprobante(@WebParam(name = "xml") byte[] xml);



    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    lunes, 7 de enero de 2019 15:44
  • Entonces el parámetro que le paso al WS es un string y no un byte[]?

    Sí, si te han pedido que pases el dato en Base64 es porque esperan un String. Precisamente el base64 sirve para eso, para poder pasar en forma de texto algo que de lo contrario sería binario. Si el WS admitiese pasarle un byte[], entonces no sería razonable que se hablase de Base64; bastaría con pasar directamente los bytes sin necesidad de codificarlos en base64.
    • Marcado como respuesta Pedro Ávila lunes, 7 de enero de 2019 18:57
    lunes, 7 de enero de 2019 18:48
    Moderador