2016-10-03 4 views
0

У меня есть текстовый файл, хранящийся локально. Я хочу хранить строковые данные в двоичном формате, а затем снова извлекать данные. В следующем фрагменте кода я выполнил преобразование.Проблемы с написанием формата байтов строковых данных в текстовом файле в C#

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 
class ConsoleApplication 
{ 
    const string fileName = "AppSettings.dat"; 

    static void Main() 
    { 
     string someText = "settings"; 
     byte[] byteArray = Encoding.UTF8.GetBytes(someText); 
     int byteArrayLenght = byteArray.Length; 
     using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create))) 
     { 
      writer.Write(someText); 
     } 
     byte[] x = new byte[byteArrayLenght]; 

     if (File.Exists(fileName)) 
     { 
      using (BinaryReader reader = new BinaryReader(File.Open(fileName, FileMode.Open))) 
      { 
       x = reader.ReadBytes(byteArrayLenght); 
      } 
      string str = Encoding.UTF8.GetString(x); 
      Console.Write(str); 
      Console.ReadKey(); 
     } 
    } 
} 

В AppSettings.dat файл байты записываются следующим образом enter image description here

Но когда я присвоили случайное значение в массив байтов и сохранить его в файл, используя BinaryWriter, как я сделано в следующем фрагменте кода

const string fileName = "AppSettings.dat"; 

static void Main() 
{ 
    byte[] array = new byte[8]; 
    Random random = new Random(); 
    random.NextBytes(array); 

    using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create))) 
    { 
     writer.Write(array); 
    } 
} 

Это фактически сохраняются данные в двоичном формате в текстовом файле, как показано на рисунке.

Я не понимаю, почему (в моем первом случае) данные байт, преобразованные из строки, отображающие человеческий читаемый формат, где я хочу сохранить данные в нечитаемом формате байта (в дальнейшем случае). Какое объяснение по этому поводу?

Есть ли способ, в котором я могу хранить строковые данные в двоичном формате без приближения к грубой силе?

FYI - Я не хочу хранить данные в формате Base64String, я хочу, чтобы он был в двоичном формате.

+0

Ваш первый файл _is_ двоичный, в некотором роде. Так получилось, что байты представляют собой текст, читаемый человеком. «F» и «F» в вашем втором примере также читаются человеком, но вы как-то называете второй файл «двоичным». –

+1

В зависимости от кодировки ваши байтовые значения могут быть читаемыми человеком или, возможно, нет. Посмотрите, например, на [список символов UTF-8] (http://www.fileformat.info/info/charset/UTF-8/ list.htm). Вы заметите, что есть много символов, которые нельзя напечатать на людях, читаемых. – 0xDECAFBAD

+0

Есть ли способ, чтобы я мог хранить их нечетким способом или только в байтовом значении или только 0 и 1 в файле. Любой будет делать. – lukai

ответ

1

Если безопасность не является проблемой, и вы просто не хотите, среднее использование, чтобы найти данные, в то время как вмешательство в файлы настроек, простой XOR будет делать:

const string fileName = "AppSettings.dat"; 

static void Main() 
{ 
    string someText = "settings"; 
    byte[] byteArray = Encoding.UTF8.GetBytes(someText); 

    for (int i = 0; i < byteArray.Length; i++) 
    { 
     byteArray[i] ^= 255; 
    } 

    File.WriteAllBytes(fileName, byteArray); 

    if (File.Exists(fileName)) 
    { 
     var x = File.ReadAllBytes(fileName); 

     for (int i = 0; i < byteArray.Length; i++) 
     { 
      x[i] ^= 255; 
     } 

     string str = Encoding.UTF8.GetString(x); 
     Console.Write(str); 
     Console.ReadKey(); 
    } 
} 

Он использует интересное свойство кодировки символов:

  • в ASCII, то 0-127 диапазон содержит наиболее часто используемые символы (от а до г, 0 до 9) и 128-256 диапазон содержит только специальные символы и акценты
  • По соображениям совместимости, в UTF-8 0- 127 содержит те же символы, что и ASCII, а диапазон 128-256 имеет особое значение (он сообщает декодеру, что символы кодируются в несколько байтов)

Все, что я делаю, это переворачивание сильного бита каждого байт. Поэтому все в диапазоне 0-127 заканчивается в диапазоне 128-256 и наоборот. Благодаря описанию, которое я описал, независимо от того, пытается ли текстовый редактор разбираться в ASCII или в UTF-8, он получит только тарабарщину.

Обратите внимание, что, хотя он не создает удобочитаемый материал, он не защищен вообще. Не используйте его для хранения конфиденциальных данных.

+0

Это именно то, что я искал. Благодарю. Я не храню конфиденциальные данные в текстовом файле, просто не хочу, чтобы он был читаемым человеком. – lukai

0

Блокнот просто считывает ваши двоичные данные и преобразует их в текст UTF8.

Этот фрагмент кода даст вам тот же результат.

byte[] randomBytes = new byte[20]; 
Random rand = new Random(); 
rand.NextBytes(randomBytes); 
Console.WriteLine(Encoding.UTF8.GetString(randomBytes)); 

Если вы хотите, чтобы люди не конвертировали ваши данные обратно в строку. то вам необходимо зашифровать ваши данные. Here - это проект, который может помочь вам в этом. Но они все еще могут читать данные в текстовом редакторе, потому что он преобразует ваши зашифрованные данные в UFT8. Они не могут преобразовать его обратно в пригодные для использования данные, если только им не требуется ключ для дешифрования ваших данных.