我需要将bitarray转换为unicode字符串(vb.net中的字符串类型的默认编码)。
例如,让我们说000000000100000100000000010000100000000001000011
是3 x 16位unicode字符的位串表示,分别为A = 65; B = 66且C = 67(codePoints导致这些位转换为整数)。
现在,这些位存储在bitarray中。有没有办法在不使用内置ChrW
函数的情况下将bitarray转换为字符串?
我需要这个,因为我已经按照编码的顺序排列了比特,所以我尽量避免双重转换以获得一些性能。
答案 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()
更快,而且它可能也不是最漂亮的解决方案;),但我在这里是怎样的我做到了:
按照你的要求做我做了这些步骤:
反转位数组(因为.NET从左到右,而不是从右到左解释它们)
创建位的字节数组。数组的大小应该是除以8(8位= 1字节)的位数四舍五入到最接近的整数(见Math.Ceiling()
)。
使用Encoding.Unicode
将字节数组解码为字符串。
将字符串转换为字符数组,将其反转,然后将新的字符数组转换回字符串。
我把它放在一个函数中:
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