2011-12-27 13 views
13

Dobrze, więc mam ciąg tekstu, zakodowany w Base 64, jak poniżej:Jak odszyfrować ciąg tekstowy od Base64 do tablicy bajtów, a otrzymam właściwość string tej tablicy bajtów bez uszkodzenia danych.

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

i potem przekonwertować ciąg z bazy 64 do tablicy bajtów tak:

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

w tym momencie chcę, aby uzyskać wartość ciągu tej tablicy bajtów i zapisać to w pliku tekstowym bez utrata lub uszkodzenie danych. Poniższy kod wydaje się nie być:

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

Czy ktoś może mi powiedzieć, gdzie idę źle.

Edytuj: Dane wyjściowe są nieczytelne. Potrzebuję zdekodować ciąg, a następnie użyć OpenSSL do odszyfrowania. Wyjście, a wynik z OpenSSL są zarówno poniżej:

Output

OpenSSL

+0

można dać więcej informacji na temat tego, co jest nie tak? czy otrzymujesz wyjątek? lub czy wyjście jest nieczytelne? –

+0

Więc ciąg podstawowy-64 jest zakodowaną tablicą bajtów innego ciągu? Czy ciąg pierwotnie przekształcił się w bajt [] używając ASCII? – vcsjones

+0

Może używasz niewłaściwego kodowania? Czy możesz pokazać, co dostajesz i czego oczekujesz? – Jan

Odpowiedz

3

Jeśli łańcuch jest zakodowany następnie zawartość będzie wyglądać podobnie jak to, co masz w pliku tekstowym. Aby jednak upewnić się, że plik nie ulega uszkodzeniu, należy zapisać zawartość pliku jako plik binarny zamiast za pomocą enkodera tekstowego. Sprawdź 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); 
    }