二进制数据向字符串转化时,常见如下代码:
S=S& Chr(AscB(MidB(Binary,i,1)))我真是没搞懂:
一、这个midb返回的是啥?按书上解释“MidB 函数用于字符串中的字节数据,其参数指定的是字节数而不是字符数”,也就是二进制流中每个字节所对应的字符了,可是这个字符是按什么字符集生成的?
二、ascb是只取字符编码的首字节,如果那个字符编码不止一个字节,岂不丢失了一半信息吗?
三、再者,用midb(binary,i,1)每次只取一个字节,假如这个二进制流是一段unicode编码,那不是不对了吗?唉,总之是一头雾水,我现在最想知道:
一、谁能画一下字符串“我是中国人”的binary形式和bstr形式的内存示意图
二、给我chr ascb midb的汇编代码,让我好好瞧瞧它们的模样
S=S& Chr(AscB(MidB(Binary,i,1)))我真是没搞懂:
一、这个midb返回的是啥?按书上解释“MidB 函数用于字符串中的字节数据,其参数指定的是字节数而不是字符数”,也就是二进制流中每个字节所对应的字符了,可是这个字符是按什么字符集生成的?
二、ascb是只取字符编码的首字节,如果那个字符编码不止一个字节,岂不丢失了一半信息吗?
三、再者,用midb(binary,i,1)每次只取一个字节,假如这个二进制流是一段unicode编码,那不是不对了吗?唉,总之是一头雾水,我现在最想知道:
一、谁能画一下字符串“我是中国人”的binary形式和bstr形式的内存示意图
二、给我chr ascb midb的汇编代码,让我好好瞧瞧它们的模样
MidB取得就是1个字节,怎么会“不止一个字节”呢?
二进制流什么都有可能,也许根本就不是字符,那妳说对不对呢?
MSDN
visula basic 文档
参考
其它信息
字符集
S=S& Chr(AscB(MidB(Binary,i,1)))
--------------------------------------首先,这代码一点也不常见!不止是罕见,而是根本没见过。
感觉极象一位外国小朋友的习作。有些不知所云!Binary是什么类型,是Byte数组?是字符串?我想若是字符串,那这句代码就是乱码生成器了!若是Byte数组:
文本型二进制流在不知道是unicode还是ANSI编码前,是不可能正确显示的。这也是我们常见乱码的原因。
所以
对unicode编码使用
s=Binary对ANSI编码使用
s=Strconv(Binary,vbUnicode)
这是asp无组件上传类常用的写法,binary是request.binaryread返回的原始字节数据请问midb到底返回的是什么类型的变量啊?是字节还是字符啊?
如果是一个字节,那怎么能放在ascb()里呢,ascb要接受字符参数
如果是一个字符,那这是什么编码的字符呢?在asp里直接用response.write输出却是乱码,但经过ascb和chr两番折腾后再输出却又是正常了,到底在做些什么呢?
Chr(AscB(MidB(Binary,i,1)))这种是单字节处理,能正常显示的前提是文本为英文,对双字节存储的中文,会是乱码;
为什么用Chr、AscB、MidB三次转换,是因为作者不明白字节数组是什么,其实,Chr(AscB(MidB(Binary,i,1))) 等同于 Chr(Binary(i)),它把一张牌多翻了两次,结果还是原地转圈,简单问题复杂化!2、ANSI编码直接输出,当然是乱码,因为VB内部字符串为Unicode编码!3、就算是用Chr(Binary(i))方式转换,也不可取,还是不支持中文,前面说了,
Strconv(Binary,vbUnicode) 可完成任务4、你认为常见,与你接触的程序环境有关,可能你见到很多这种写法,也不奇怪,源程序以误传误比这更常见!写段代码,你自己看结果体会吧!
Private Sub Form_Load()
Dim Binary(4) As Byte, i As Long, s As String
Binary(0) = &H42 '(字母B的ASCII码)
Binary(1) = &H64 '(字母d的ASCII码)
Binary(2) = &H48 '(字母H的ASCII码)
Binary(3) = &H58 '(字母X的ASCII码)
Binary(4) = &H52 '(字母R的ASCII码)
s = ""
For i = 1 To 5
s = s & Chr(AscB(MidB(Binary, i, 1)))
Next
Debug.Print "三次转换:" & s
s = ""
For i = 0 To 4
s = s & Chr(Binary(i))
Next
Debug.Print "直接转换:" & s
s = Binary
Debug.Print "直接输出:" & s
s = StrConv(Binary, vbUnicode)
Debug.Print "函数转换:" & s
End Sub输出结果:
---------------------------------
三次转换:BdHXR
直接转换:BdHXR
直接输出:摂塈
函数转换:BdHXR
Chr(Binary(i))和MidB(Binary, i, 1)到底有什么区别?前者可以正常输出,后者却是乱码!
再者,在vbs脚本里,前者的语法是错的,所以为了取到binary中的字节只能用后者,更奇怪的是,
这个调用:asc(MidB(Binary, i, 1))居然报错“无效的过程调用或参数”,但用typename(MidB(Binary, i, 1))查看其类型明明又显示为String!
换成ascb(MidB(Binary, i, 1))竟然又可以了,返回的正是binary中字节数据的整数形式,这岂不太奇怪了!
唉,要怪都怪vbs的弱语法!既没有Binary(i),又没有StrConv,可偏偏是“外国小朋友的习作”Chr(AscB(MidB(Binary,i,1))) 能正常工作!