如果您正在處理字節數組,您必須先知道字符編碼,然後才能將其轉換爲字符串。沒有這些知識,字節將被轉換爲錯誤的字符。
ADODB.Stream
object可以處理字節數組。這裏是一個函數,做的是:
Const adTypeBinary = 1
Const adTypeText = 2
Const adModeReadWrite = 3
Function BytesToString(bytes, charset)
With CreateObject("ADODB.Stream")
.Mode = adModeReadWrite
.Type = adTypeBinary
.Open
.Write bytes
.Position = 0
.Type = adTypeText
.Charset = charset
BytesToString = .ReadText
End With
End Function
這裏是如何使用它:
MsgBox BytesToString(binary, "Windows-1252")
爲了完整起見,這是反向操作:
Function StringToBytes(str, charset)
With CreateObject("ADODB.Stream")
.Mode = adModeReadWrite
.Type = adTypeText
.Charset = charset
.Open
.WriteText str
.Position = 0
.Type = adTypeBinary
StringToBytes = .Read
End With
End Function
由於您的輸入似乎是字符串像"00110001 00110010 00110011 00110100"
,她e是將其轉換成一個字節數組,然後你就可以用BytesToString()
使用上面的函數:
Function BinaryStringToBytes(binaryStr)
Dim b, n, i, l
l = GetLocale
SetLocale 1031
With CreateObject("ADODB.Stream")
.Mode = adModeReadWrite
.Charset = "Windows-1252"
.Type = adTypeText
.Open
For Each b In Split(binaryStr, " ")
If Len(b) <> 8 Or Replace(Replace(b, "0", ""), "1", "") <> "" Then
' invalid procedure call or argument
Err.Raise 5, "BinaryStringToBytes", _
"Only stings of 8-blocks of 0s and 1s, " & _
"separated by a single space are accepted."
End If
n = 0
For i = 0 To 7
n = n + Mid(b, 8 - i, 1) * 2^i
Next
.WriteText Chr(n)
Next
.Position = 0
.Type = adTypeBinary
BinaryStringToBytes = .Read
End With
SetLocale l
End Function
使用
Dim input, output
input = "00110001 00110010 00110011 00110100"
output = BytesToString(BinaryStringToBytes(input), "Windows-1252")
MsgBox output ' -> "1234"
而且,更重要的是,它能夠正確處理多字節編碼:
input = "00110001 00110010 00110011 00110100 11000011 10100100"
output = BytesToString(BinaryStringToBytes(input), "UTF-8")
MsgBox output ' -> "1234ä"
即二進制不以任何方式 「加密」。另外,「以二進制存儲」甚至是什麼意思?你不能用二進制存儲任何東西。或者,表達方式不同,*所有*都以二進制形式存儲在計算機中。那麼,它是什麼?一個字節數組?它從何而來?如果它是一個字節數組,它代表了哪種字符編碼? – Tomalak 2014-10-29 07:43:00