Строковое значение system.byte [] при покрытии значения Base64 в строку в c# - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть два файла LDIF, из которых я читаю значения и использую их для сравнения, используя c# Один из attribute: value в LDIF - это значение base64, необходимо преобразовать его в формат UTF-8

displayName:: Rmlyc3ROYW1lTGFzdE5hbWU=

Поэтому я подумал об использовании строки -> byte [], но я не могу использовать указанное выше значение displayName в качестве строки

byte[] newbytes = Convert.FromBase64String(displayname);
string displaynamereadable = Encoding.UTF8.GetString(newbytes);

В моем коде C# я делаю это для получить значения из файла ldif

for(Entry entry ldif.ReadEntry() ) //reads value from ldif for particular user's
{
    foreach(Attr attr in entry)   //here attr gives attributes of a particular user
    {
        if(attr.Name.Equals("displayName"))
        {
            string attVal = attr.Value[0].ToString();       //here the value of String attVal is system.Byte[], so not able to use it in the next line
            byte[] newbytes = Convert.FromBase64String(attVal);   //here it throws an error mentioned below 
            string displaynamereadable = Encoding.UTF8.GetString(attVal);
        }
    }
}

Ошибка:

The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

Я пытаюсь использовать attVal как String, чтобы я мог получить закодированное значение UTf-8, но его выбрасывание ошибка. Я также пытался использовать BinaryFormatter и MemoryStream, он работал, но он вставил так много новых символов с исходным значением.

Снимок BinaryFormatter:

object obj = attr.Value[0];
byte[] bytes = null;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
   {
      bf.Serialize(ms, obj);
      bytes = (ms.ToArray());
   }
 string d = Encoding.UTF8.GetString(bytes);

Таким образом, результат после кодирования должен быть : "FirstNameLastName"

Но это дает "\u0002 \u004 \u004 ...................FirstNameLastName\v"

Спасибо,

1 Ответ

1 голос
/ 23 апреля 2020

Base64 был разработан для отправки двоичных данных по каналам передачи, которые поддерживают только простой текст, и в результате Base64 всегда представляет собой текст ASCII. Поэтому, если attr.Value[0] является байтовым массивом, просто интерпретируйте эти байты как строку, используя кодировку ASCII:

String attVal = Encoding.ASCII.GetString(attr.Value[0] as Byte[]);
Byte[] newbytes = Convert.FromBase64String(attVal);
String displaynamereadable = Encoding.UTF8.GetString(newbytes);

Также обратите внимание, что ваш код выше вводил attVal в эту последнюю строку, а не newbytes.

...