二进制字符串操作






3.92/5 (6投票s)
2006年12月11日
3分钟阅读

85526

983
本文演示了如何将字符串转换为二进制并对其进行操作。
引言
本文介绍了如何将字符串转换为二进制流,以及如何将二进制数据的BitArray
转换为 ASCII 字符串。.NET Framework 没有提供通过显式指定每个位来构造数据字节的方法。这使得将包含二进制数据的字符串转换回 ASCII 编码的数据变得困难,这在某些调试场景中是一个有用的练习。
使用代码
让我们首先看看如何将字符串转换为二进制。 我们使用 MemoryStream
和 BinaryWriter
对象来完成此操作。 BinaryWriter
对象允许我们为给定的字符串写入二进制数据流。 因为我们没有将二进制数据发送到任何地方(在本例中),我们将使用 MemoryStream
对象为我们提供一个要使用的流。
MemoryStream ms_memStream = new MemoryStream();
BinaryWriter br_binaryWriter = new BinaryWriter(ms_memStream);
try
{
br_binaryWriter.Write(ba_originalString);
}
catch (Exception e)
{
System.Console.WriteLine("Exception writing binary" +
" data to memory stream: " +
e.Message);
Environment.Exit(1);
}
BinaryWriter.Write(String str)
方法将字符串参数转换为二进制数据流,该数据流存储在关联的流对象中,在本例中为我们的 MemoryStream
对象。 重要的是要注意,因为数据已经被序列化,所以二进制流中的数据字节不再是最重要的位在左边,所以字母“T”将是 00101010 (ASCII 84) 而不是 01010100。在稍后读取数据时,牢记这一点非常重要,因为如果我们不考虑这一点,我们将无法正确读取该值。 在这种情况下,我们将把数据解释为 ASCII 值 42,这不是字母“T”。
将二进制流转换回 ASCII 可以通过多种方式完成,具体取决于我们拥有的二进制数据的形式。 最简单的方法是我们有二进制数据作为流,如上所示。 如果要从文件中读取二进制数据,此方法非常有用。 为此,我们只需使用以下代码
String str_recoveredString =
Encoding.ASCII.GetString(ms_memStream.ToArray());
如果我们想一个接一个地查看流中的位,我们必须将二进制数据转换为 BitArray
对象,如下所示
BitArray ba_bitArray = new BitArray(ms_memStream.ToArray());
注意:作者在使用二进制数据流进行加密时遇到了对这种方法的需求。 这需要查看密钥字符串中的各个位,以从中生成唯一的盐。
一旦二进制流被 BitArray
对象封装,它就变得稍微难以操作。 没有一种传统的转换/解析方法有效,因为 BitArray
对象仅将值作为 Boolean
返回。 此外,.NET Framework 没有提供通过显式设置其中每个位的值来创建 byte
对象的方法。 因此,要将 BitArray
对象中的二进制数据转换回 ASCII,我们必须从二进制数据计算十进制值,如下所示
private static string recoverText(BitArray ba_bitArray)
{
string str_finalString = "";
int int_binaryValue;
BitArray ba_tempBitArray;
// Manually read the first 8 bits and
while (ba_bitArray.Length > 0)
{
ba_tempBitArray = new BitArray(ba_bitArray.Length - 8);
int_binaryValue = 0;
if (ba_bitArray[0])int_binaryValue += 1;
if (ba_bitArray[1]) int_binaryValue += 2;
if (ba_bitArray[2]) int_binaryValue += 4;
if (ba_bitArray[3]) int_binaryValue += 8;
if (ba_bitArray[4]) int_binaryValue += 16;
if (ba_bitArray[5]) int_binaryValue += 32;
if (ba_bitArray[6]) int_binaryValue += 64;
if (ba_bitArray[7]) int_binaryValue += 128;
str_finalString += Char.ConvertFromUtf32(int_binaryValue);
int int_counter = 0;
for (int i = 8; i < ba_bitArray.Length; i++)
{
ba_tempBitArray[int_counter++] = ba_bitArray[i];
}
ba_bitArray = ba_tempBitArray;
}
return str_finalString;
}
在这里,我们只是将 8 位二进制数转换为十进制数,并使用 Char.ConvertFromUtf32(int i)
方法返回具有相应 ASCII 值的 String
对象。 我们对 BitArray
中的每个八位字节块都执行此操作,然后返回字符串。
历史
- 最初编写时间:2006 年 10 月 10 日。