65.9K
CodeProject 正在变化。 阅读更多。
Home

二进制字符串操作

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.92/5 (6投票s)

2006年12月11日

3分钟阅读

viewsIcon

85526

downloadIcon

983

本文演示了如何将字符串转换为二进制并对其进行操作。

Sample Image

引言

本文介绍了如何将字符串转换为二进制流,以及如何将二进制数据的BitArray转换为 ASCII 字符串。.NET Framework 没有提供通过显式指定每个位来构造数据字节的方法。这使得将包含二进制数据的字符串转换回 ASCII 编码的数据变得困难,这在某些调试场景中是一个有用的练习。

使用代码

让我们首先看看如何将字符串转换为二进制。 我们使用 MemoryStreamBinaryWriter 对象来完成此操作。 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 日。
© . All rights reserved.