首页 > 解决方案 > 是否可以将字符串转换为二进制表示的字节数组

问题描述

我需要将字符串形式的整数转换为二进制表示的字节数组。例如:我有一个值"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();

标签: c#arraysbinarytype-conversionbyte

解决方案


你可以更容易地做到这一点:

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 模式存储。

将数字的数值存储为字节和将此数字存储为字符(可能是字符串的元素)之间的区别在于使用了不同的编码。

字符串"1001"以 UTF-16 格式存储为

00000000 00110001  00000000 00110000  00000000 00110000  00000000 00110001

其中0被编码为00000000 00110000(十进制48)并被1编码为00000000 00110001(十进制49)。此外,还为字符串存储了附加数据,如其长度、NUL 字符终止符和与其类性质相关的数据。


存储结果的另一种方法是使用BitArray 类的数组或使用字节数组的数组,其中内部数组中的每个字节仅存储一位,即为 0 或 1。


推荐阅读