是否可以将字符串转换为二进制表示的字节数组

Posted

技术标签:

【中文标题】是否可以将字符串转换为二进制表示的字节数组【英文标题】:Is it possible to convert a string to byte array in binary representation 【发布时间】:2021-09-21 14:38:53 【问题描述】:

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

【问题讨论】:

是的,这绝对是可能的。 到目前为止,您自己尝试过什么?你遇到了什么问题?你研究了什么?请编辑您的问题以包含更多信息。我推荐taking the tour,以及阅读how to ask a good question 和what's on topic。 你能推荐一个方法吗? 我已经添加了我尝试过的代码。请检查一下 您可能想看看 BitConverter 类及其 GetBytes 方法。输入是字符串类型还是数字类型? 【参考方案1】:

您可以更轻松地做到这一点:

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 table,用于不带重音或变音符号的拉丁字母、数字和最常见的标点符号,只是它使用每个字符 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 Class 的数组或使用字节数组,其中内部数组中的每个字节将仅存储一位,即为 0 或 1。

【讨论】:

我试过了,但结果是[2,9]的字节数组。我正在尝试将其转换为二进制表示 字节数组按要求将此信息存储为 0b0000_0010, 0b0000_1001 ,但打印时又转换为十进制值。 @shashi9915 我认为你需要了解二进制整数的工作原理

以上是关于是否可以将字符串转换为二进制表示的字节数组的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为十六进制字符串

如何在 C++ 中将字节数组转换为十六进制字符串?

如何将十六进制字符串转换为字节数组? [复制]

将二进制字符串转换为字节数组

使用 C#,将包含二进制数据的字符串转换为字节数组的最有效方法是啥

C# 校验并转换 16 进制字符串到字节数组