是否可以将字符串转换为二进制表示形式的字节数组
Is it possible to convert a string to byte array in binary representation
我需要将字符串形式的整数转换为二进制表示形式的字节数组。
例如:我有一个值 "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字符存储数字table。此 table 等同于 ASCII table 对于没有重音符号或变音符号的拉丁字母、数字和最常见的标点符号,除了它使用每个字符 16 位而不是 7 位(存储时扩展为 8 位)作为字节)。根据这个table,字符
'9'
表示为二进制00111001
(十进制57)
字符串 "1001"
以 UTF-16 格式存储为
00000000 00110001 00000000 00110000 00000000 00110000 00000000 00110001
其中 0
编码为 00000000 00110000
(十进制 48),1
编码为 00000000 00110001
(十进制 49)。此外,还会为字符串存储其他数据,如长度、NUL 字符终止符和与其 class 性质相关的数据。
存储结果的替代方法是使用 BitArray Class 的数组或使用字节数组,其中内部数组中的每个字节仅存储一位,即,要么0 或 1。
我需要将字符串形式的整数转换为二进制表示形式的字节数组。
例如:我有一个值 "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字符存储数字table。此 table 等同于 ASCII table 对于没有重音符号或变音符号的拉丁字母、数字和最常见的标点符号,除了它使用每个字符 16 位而不是 7 位(存储时扩展为 8 位)作为字节)。根据这个table,字符
'9'
表示为二进制00111001
(十进制57)
字符串 "1001"
以 UTF-16 格式存储为
00000000 00110001 00000000 00110000 00000000 00110000 00000000 00110001
其中 0
编码为 00000000 00110000
(十进制 48),1
编码为 00000000 00110001
(十进制 49)。此外,还会为字符串存储其他数据,如长度、NUL 字符终止符和与其 class 性质相关的数据。
存储结果的替代方法是使用 BitArray Class 的数组或使用字节数组,其中内部数组中的每个字节仅存储一位,即,要么0 或 1。