【问题标题】: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 questionwhat's on topic
  • 你能推荐一个方法吗?
  • 我已经添加了我尝试过的代码。请检查一下
  • 您可能想看看 BitConverter 类及其 GetBytes 方法。输入是字符串类型还是数字类型?

标签: c# arrays binary type-conversion byte


【解决方案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 我认为你需要了解二进制整数的工作原理
猜你喜欢
  • 2019-06-22
  • 2011-03-27
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多