[英]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();
}
}
}
但是,当我在字节数组中分配了一些随机值并使用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();
}
}
它利用了字符编码的有趣特性:
我要做的就是翻转每个字节的强位。 因此,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.