簡體   English   中英

用C#在文本文件中寫入字符串數據的字節格式的問題

[英]Problems with writing bytes format of string data in Text File in 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文件中,字節以以下方式寫入 在此處輸入圖片說明

但是,當我在字節數組中分配了一些隨機值並使用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);
    }
}

它實際上以二進制格式將數據保存在文本文件中,如圖所示。 在此處輸入圖片說明

我不明白為什么(在我的第一種情況下)從顯示人類可讀格式的字符串轉換為字節數據,為什么要以非可讀字節格式(后一種情況)保存數據。 請問對此有何解釋?

有什么方法可以在不接近蠻力的情況下以二進制格式存儲字符串數據?

僅供參考-我不想將數據保留為Base64String格式,而是希望其為二進制格式。

如果不考慮安全性,並且您只是不想讓普通用戶在介入設置文件的同時查找數據,則可以使用簡單的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范圍包含最常用的字符(a到z,0到9),而128-256范圍僅包含特殊符號和重音
  • 出於兼容性原因,在UTF-8中0-127范圍包含與ASCII相同的字符,而128-256范圍具有特殊含義(它告訴解碼器字符已編碼為多個字節)

我要做的就是翻轉每個字節的強位。 因此,0-127范圍內的所有內容最終都在128-256范圍內,反之亦然。 多虧了我描述的屬性,無論文本閱讀器嘗試使用ASCII還是UTF-8進行解析,它只會變得亂七八糟。

請注意,盡管它不會產生人類可讀的內容,但它絕對不安全。 不要使用它來存儲敏感數據。

記事本僅讀取您的二進制數據並將其轉換為UTF8文本。

此代碼段將為您提供相同的結果。

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

如果要阻止人們將數據轉換回字符串。 那么您需要加密您的數據。 是一個可以幫助您的項目。 但是他們仍然能夠在文本編輯器中讀取數據,因為它會將加密的數據轉換為UFT8。 他們無法將其轉換回可用數據,除非他們必須輸入密鑰才能解密您的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM