2011-12-27 12 views
13

Ok, quindi ho una stringa di testo, codificato in base 64 come di seguito:Come decodificare una stringa di testo da un Base64 a un array di byte, e ottenere la proprietà stringa di questo array di byte senza corruzione dei dati

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

ho poi convertire il mio stringa da base 64 a un array di byte in questo modo:

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

a questo punto, voglio ottenere il valore stringa di questo array di byte e salvare questo in un file di testo senza perdita di dati o corruzione. Il codice seguente non sembra farlo:

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

Qualcuno può dirmi dove sto andando male.

Modifica: l'output è illeggibile, è necessario prendere la stringa decodificata e quindi utilizzare OpenSSL per decrittografarlo. L'uscita e il risultato da OpenSSL sono entrambi al di sotto:

Output

OpenSSL

+0

si può dare più informazioni su ciò che sta andando male? ricevi un'eccezione? o l'output è illeggibile? –

+0

Quindi la stringa base 64 è una matrice di byte codificata di un'altra stringa? La stringa è stata originariamente convertita in un byte [] usando ASCII? – vcsjones

+0

Forse usi una codifica errata? Puoi mostrare cosa ottieni e cosa ti aspetti? – Jan

risposta

3

Se la stringa è codificato quindi il contenuto apparirebbe molto simile a quello che hai nel file di testo. Ma per assicurarti che il file non venga corrotto, devi scrivere il contenuto del file come binario invece di usare un codificatore di testo. Controlla 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); 
    } 
Problemi correlati