繁体   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