c# - 是否可以将字符串转换为二进制表示的字节数组
问题描述
我需要将字符串形式的整数转换为二进制表示的字节数组。例如:我有一个值"29"
,然后将此值转换为二进制等效值2-> 0010 and 9-> 1001
并将其存储在字节数组中0th index has 0010 and 1st index has 1001
。我已经尝试过了,但这给了我一个 8 个字节的数组。
var val = "29".ToCharArray();
var a = Convert.ToString(Convert.ToInt32(Convert.ToString(val[0])), 2).PadLeft(4, '0');
var b = Convert.ToString(Convert.ToInt32(Convert.ToString(val[1])), 2).PadLeft(4, '0');
var c = a.ToList();
c.ForEach(x => sb.Append(Convert.ToString(x) + " "));
var f = sb.ToString().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var g = f.ToList();
byte[] buff = new byte[g.Count];
for (int z = 0; z < g.Count; z++)
{
buff[z] = (byte)Convert.ToInt32(g[z]);
}
var h = b.ToList();
sb.Clear();
h.ForEach(x => sb.Append(Convert.ToString(x) + " "));
var i = sb.ToString().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var j = i.ToList();
byte[] buff2 = new byte[j.Count];
for (int k = 0; k < j.Count; k++)
{
buff2[k] = (byte)Convert.ToInt32(j[k]);
}
byte[] buffer = buff.Concat(buff2).ToArray();
解决方案
你可以更容易地做到这一点:
string s = "29";
var buffer = new byte[s.Length];
for (int i = 0; i < buffer.Length; i++) {
buffer[i] = (byte)(s[i] - '0');
}
解释:
- 我们创建一个与输入字符串长度相同的字节缓冲区,因为字符串中的每个字符都应该是十进制数字。
- 在 C# 中,字符是数字类型。我们从代表我们数字的字符中减去该字符
'0'
以获得它的数值。String
我们通过使用允许我们访问字符串中的单个字符的索引器来获得这个数字。 - 结果是我们转换为的整数,
byte
然后我们可以将其插入缓冲区。
Console.WriteLine(buffer[0])
打印2
,因为数字被转换为十进制格式的字符串以进行显示。调试器、控制台或文本框显示的所有内容始终是数据已转换为的字符串。这种转换称为格式化。因此,您不会将结果视为二进制。但请相信我,它以请求的二进制格式存储在字节中。
您可以使用Convert.ToString
并指定所需的数字基数作为第二个参数,以查看二进制结果。
foreach (byte b in buffer) {
Console.WriteLine($"{b} --> {Convert.ToString(b, toBase: 2).PadLeft(4, '0')}");
}
如果要以这种可视二进制格式存储,则必须将其存储在字符串数组中
var stringBuffer = new string[s.Length];
for (int i = 0; i < stringBuffer.Length; i++) {
stringBuffer[i] = Convert.ToString(s[i] - '0', toBase: 2).PadLeft(4, '0');
}
请注意,所有内容都以二进制格式存储在计算机中,包含 0 和 1,但您永远不会直接看到这些 0 和 1。您看到的始终是屏幕上的图像。此图像是从特定字体的字符图像创建的。这些字符是由于将某些数据转换为字符串(即格式化数据)而产生的。相同的数据在使用不同文化的 PC 上可能看起来不同,但底层数据以相同的 0 和 1 模式存储。
将数字的数值存储为字节和将此数字存储为字符(可能是字符串的元素)之间的区别在于使用了不同的编码。
- 该字节将其存储为等效于十进制数的二进制数。即,
9
(十进制)变为00001001
(二进制)。 - 字符串或字符使用 .NET 中的 UTF-16 字符表存储数字。此表等效于不带重音或变音符号的拉丁字母、数字和最常见的标点符号的ASCII 表,只是它使用每个字符 16 位而不是 7 位(存储为字节时扩展为 8)。根据该表,字符
'9'
由二进制00111001
(十进制 57)表示。
字符串"1001"
以 UTF-16 格式存储为
00000000 00110001 00000000 00110000 00000000 00110000 00000000 00110001
其中0
被编码为00000000 00110000
(十进制48)并被1
编码为00000000 00110001
(十进制49)。此外,还为字符串存储了附加数据,如其长度、NUL 字符终止符和与其类性质相关的数据。
存储结果的另一种方法是使用BitArray 类的数组或使用字节数组的数组,其中内部数组中的每个字节仅存储一位,即为 0 或 1。