2011-12-27 10 views
13

Ok, así que tengo una cadena de texto, codificado en base 64, como a continuación:cómo decodificar una cadena de texto a partir de una base 64 a una matriz de bytes, y el obtener la propiedad de cadena de esta matriz de bytes sin corrupción de datos

string myText = "abcBASE64TEXTGOESHEREdef=="; // actual string is 381 characters long with trailing '==' 

entonces me convierto mi cadena a partir de la base 64 a una matriz de bytes de este modo:

byte[] decodedFromBase64 = Convert.FromBase64String(myText); 

en este punto, quiero obtener el valor de cadena de esta matriz de bytes y guardar esto en un archivo de texto sin pérdida de datos o corrupción. El código siguiente no parece estar haciéndolo:

string myDecodedText = Encoding.ASCII.GetString(decodedFromBase64); 
StreamWriter myStreamWriter = new StreamWriter("C:\\OpenSSL-Win32\\bin\\textToDecrypt.txt"); 
myStreamWriter.Write(myString); 
myStreamWriter.Flush(); 
myStreamWriter.Close(); 

¿Alguien puede decirme por dónde me equivoco?

Editar: La salida no se puede leer, necesito tomar la cadena decodificada y luego usar OpenSSL para descifrarla. La salida y el resultado de OpenSSL son a la vez a continuación:

Output

OpenSSL

+0

le puede dar más información acerca de lo que va mal? ¿recibes una excepción? o es la salida ilegible? –

+0

¿Entonces la cadena base-64 es una matriz de bytes codificada de otra cadena? ¿La cadena se convirtió originalmente en un byte [] usando ASCII? – vcsjones

+0

¿Quizás utilizas una codificación incorrecta? ¿Puedes mostrar lo que obtienes y lo que esperas? – Jan

Respuesta

3

Si la cadena se codifica a continuación el contenido se parece mucho a lo que tiene en su archivo de texto. Pero para garantizar que el archivo no se corrompa, debe escribir el contenido del archivo como binario en lugar de usar un codificador de texto. Consulte File.WriteAllBytes().

13
public static string base64Decode(string data) 
{ 
    byte[] toDecodeByte = Convert.FromBase64String(data); 

    System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding(); 
    System.Text.Decoder utf8Decode = encoder.GetDecoder(); 

    int charCount = utf8Decode.GetCharCount(toDecodeByte, 0, toDecodeByte.Length); 

    char[] decodedChar = new char[charCount]; 
    utf8Decode.GetChars(toDecodeByte, 0, toDecodeByte.Length, decodedChar, 0); 
    string result = new String(decodedChar); 
    return result; 
} 
1
static void Main(string[] args) 
    { 
     string completeUrl = SERVICE_URL; 
     WebRequest request = WebRequest.Create(completeUrl); 
     request.Credentials = CredentialCache.DefaultCredentials; 
     WebProxy proxyObject = new WebProxy(SERVICE_URL, true); 
     request.Proxy = proxyObject; 
     HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); 
     byte[] data; 
     const int BUFFER_SIZE = 2048; 
     int bytesRead; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     using (MemoryStream mss = new MemoryStream()) 
     { 
      using (BinaryReader readers = new 
      BinaryReader(webResponse.GetResponseStream(), System.Text.Encoding.UTF8)) 
      { 
       while ((bytesRead = readers.Read(buffer, 0, BUFFER_SIZE)) > 0) 
       { 
        mss.Write(buffer, 0, bytesRead); 
       } 
       data = mss.ToArray(); 
       System.Text.Encoding enc = System.Text.Encoding.GetEncoding("iso-8859-1"); 
       string str = enc.GetString(data); 
       XmlDocument xdoc = new XmlDocument(); 
       xdoc.LoadXml(str); 
       XmlNode xmlList = xdoc.ChildNodes[1]; 
       XmlNode item = xmlList.ChildNodes[1]; //this is your data : JVBERi0xLjUNCiXNzc3NDQoxIDAgb2JqDQo8PA0KL0NyZWF0b3IgKERvY3VtZW50UHJ 
       Base64Decode(item.InnerText.ToString()); 
       Console.WirteLine("File successfully saved"); 
       Console.ReadLine(); 
      } 
     } 
    } 

    public static void Base64Decode(string base64EncodedData) 
    { 
     var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); 
     File.WriteAllBytes("pdf.pdf", base64EncodedBytes); 
    } 
Cuestiones relacionadas