不使用ChrW函数将bitarray转换为字符串

时间:2017-11-07 21:44:36

标签: string vb.net unicode

我需要将bitarray转换为unicode字符串(vb.net中的字符串类型的默认编码)。

例如,让我们说000000000100000100000000010000100000000001000011是3 x 16位unicode字符的位串表示,分别为A = 65; B = 66且C = 67(codePoints导致这些位转换为整数)。

现在,这些位存储在bitarray中。有没有办法在不使用内置ChrW函数的情况下将bitarray转换为字符串?

我需要这个,因为我已经按照编码的顺序排列了比特,所以我尽量避免双重转换以获得一些性能。

2 个答案:

答案 0 :(得分:1)

使用Byte()System.Text.Encoding ...

'BIN: 00000000 01000001 00000000 01000010 00000000 01000011
'HEX:    0   0    4   1    0   0    4   2    0   0    4   3
Dim s1 As String = "ABC"
Console.WriteLine("Original string:" & s1)
Dim b1 As Byte() = System.Text.Encoding.BigEndianUnicode.GetBytes(s1)
Console.WriteLine("Big-endian UTF-16 (Hex):" & BitConverter.ToString(b1))
b1(1) = b1(1) Or CByte(&H4) 'change byte 1 from 01000001 to 01000101
Dim s2 As String = System.Text.Encoding.BigEndianUnicode.GetString(b1)
Console.WriteLine("Modified string:" & s2)
Console.ReadKey()

答案 1 :(得分:1)

我不知道这实际上是否比使用ChrW()更快,而且它可能也不是最漂亮的解决方案;),但我在这里是怎样的我做到了:

按照你的要求做我做了这些步骤:

  1. 反转位数组(因为.NET从左到右,而不是从右到左解释它们)

  2. 创建位的字节数组。数组的大小应该是除以8(8位= 1字节)的位数四舍五入到最接近的整数(见Math.Ceiling())。

  3. 使用Encoding.Unicode将字节数组解码为字符串。

  4. 将字符串转换为字符数组,将其反转,然后将新的字符数组转换回字符串。

  5. 我把它放在一个函数中:

    Public Function BitArrayToString(ByVal Bits As BitArray) As String
        'Reverse the bits (I didn't have access to a compiler tha supports Linq, please don't hate).
        Dim ReversedValues As Boolean() = New Boolean(Bits.Count - 1) {}
        For x As Integer = 0 To Bits.Count - 1
            ReversedValues((ReversedValues.Length - 1) - x) = Bits(x)
        Next
    
        'Put the reversed bits into a new bit array.
        Dim ReversedBits As New BitArray(ReversedValues)
    
        'Declare a byte array to 1/8th of the bit array's size, rounded up to the nearest integer.
        Dim Bytes As Byte() = New Byte(Math.Ceiling(ReversedBits.Length / 8) - 1) {}
        ReversedBits.CopyTo(Bytes, 0)
    
        'Decode the byte array into a string.
        Dim Result As String =  System.Text.Encoding.Unicode.GetString(Bytes)
    
        'Get the string as a char array and reverse it.
        Dim Chars As Char() = Result.ToCharArray()
        Array.Reverse(Chars)
    
        'Return the resulting string from our reversed chars.
        Return New String(Chars)
    End Function
    

    在线测试: https://ideone.com/SUTWlJ