字符串编码(ASCII、UTF8、SHIFT_JIS 等)旨在将人类语言归类为二进制(字节)形式。它不是为存储任意二进制数据而设计的,例如整数的二进制形式。
虽然您的二进制数据将被解释为字符串,但其中一些信息会丢失,这意味着以这种方式存储二进制数据在一般情况下会失败。您可以使用以下代码查看失败的地方:
for (int i = 0; i < 255; ++i)
{
var byteData = new byte[] { (byte)i };
var stringData = System.Text.Encoding.ASCII.GetString(byteData);
var encodedAsBytes = System.Text.Encoding.ASCII.GetBytes(stringData);
Console.WriteLine("{0} vs {1}", i, (int)encodedAsBytes[0]);
}
Try it online
正如你所看到的,它一开始就很好,因为所有的字符代码都对应于 ASCII 字符,但是一旦我们得到数字(即 128 及以上),我们开始需要超过 7 位来存储二进制价值。此时它不再被正确解码,我们开始看到 63 而不是输入值。
最终,您将遇到使用任何字符串编码对二进制数据进行编码的问题。您需要选择一种专门用于将二进制数据存储为字符串的编码方法。
两种流行的方法是:
十六进制示例(使用十六进制方法here):
int initialValue = 2000;
Console.WriteLine(initialValue);
// Convert from int to bytes and then to hex
byte[] bytesValue = BitConverter.GetBytes(initialValue);
string stringValue = ByteArrayToString(bytesValue);
Console.WriteLine("As hex: {0}", stringValue); // outputs D0070000
// Convert form hex to bytes and then to int
byte[] decodedBytesValue = StringToByteArray(stringValue);
int intValue = BitConverter.ToInt32(decodedBytesValue, 0);
Console.WriteLine(intValue);
Try it online
Base64 示例:
int initialValue = 2000;
Console.WriteLine(initialValue);
// Convert from int to bytes and then to base64
byte[] bytesValue = BitConverter.GetBytes(initialValue);
string stringValue = Convert.ToBase64String(bytesValue);
Console.WriteLine("As base64: {0}", stringValue); // outputs 0AcAAA==
// Convert form base64 to bytes and then to int
byte[] decodedBytesValue = Convert.FromBase64String(stringValue);
int intValue = BitConverter.ToInt32(decodedBytesValue, 0);
Console.WriteLine(intValue);
Try it online
附:如果您只是想将整数转换为字符串(例如“2000”),那么您可以简单地使用.ToString():
int initialValue = 2000;
string stringValue = initialValue.ToString();