二进制数据向字符串转化时,常见如下代码:
S=S& Chr(AscB(MidB(Binary,i,1)))我真是没搞懂:
一、这个midb返回的是啥?按书上解释“MidB 函数用于字符串中的字节数据,其参数指定的是字节数而不是字符数”,也就是二进制流中每个字节所对应的字符了,可是这个字符是按什么字符集生成的?
二、ascb是只取字符编码的首字节,如果那个字符编码不止一个字节,岂不丢失了一半信息吗?
三、再者,用midb(binary,i,1)每次只取一个字节,假如这个二进制流是一段unicode编码,那不是不对了吗?唉,总之是一头雾水,我现在最想知道:
一、谁能画一下字符串“我是中国人”的binary形式和bstr形式的内存示意图
二、给我chr ascb midb的汇编代码,让我好好瞧瞧它们的模样

解决方案 »

  1.   

    MidB(Binary,i,1)的意思就是从字符串Binary的第i位取一个字符
      

  2.   

    如果是一般字符串,你根本不必考虑是否中文,直接用MID来取就可以了
      

  3.   

    不明白你说的“二进制数据向字符串转化”是什么意思。从代码看,它显然不支持 Unicode 码的源数据。如果仅仅是为了从 ANSI 码转 Unicode 码,我宁可用:s = strcon(binary, vbunicode)
      

  4.   

    //ascb是只取字符编码的首字节,如果那个字符编码不止一个字节,岂不丢失了一半信息吗
    MidB取得就是1个字节,怎么会“不止一个字节”呢?
      

  5.   

    //假如这个二进制流是一段unicode编码,那不是不对了吗?
    二进制流什么都有可能,也许根本就不是字符,那妳说对不对呢?
      

  6.   

    关于字符集,请参考
    MSDN
      visula basic 文档
         参考
           其它信息
             字符集
      

  7.   

    二进制数据向字符串转化时,常见如下代码:
    S=S& Chr(AscB(MidB(Binary,i,1)))
    --------------------------------------首先,这代码一点也不常见!不止是罕见,而是根本没见过。
    感觉极象一位外国小朋友的习作。有些不知所云!Binary是什么类型,是Byte数组?是字符串?我想若是字符串,那这句代码就是乱码生成器了!若是Byte数组:
    文本型二进制流在不知道是unicode还是ANSI编码前,是不可能正确显示的。这也是我们常见乱码的原因。
    所以
    对unicode编码使用
    s=Binary对ANSI编码使用
    s=Strconv(Binary,vbUnicode)
      

  8.   

    回楼上:
    这是asp无组件上传类常用的写法,binary是request.binaryread返回的原始字节数据请问midb到底返回的是什么类型的变量啊?是字节还是字符啊?
    如果是一个字节,那怎么能放在ascb()里呢,ascb要接受字符参数
    如果是一个字符,那这是什么编码的字符呢?在asp里直接用response.write输出却是乱码,但经过ascb和chr两番折腾后再输出却又是正常了,到底在做些什么呢?
      

  9.   

    我本不想再说这个问题,但楼主实在是中毒太深,不救不行了^_^1、为什么说:这是一个“外国小朋友的习作”?首先它不支持中文,其次它纯粹是一串废话!Binary是文本文件的二进制数据(Byte数组),所以其应为ANSI编码;
    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
      

  10.   

    就是没搞懂:
    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))) 能正常工作!
      

  11.   

    你要确定Binary的数据类型到底,用Binary()声明才是动态数组,否则是Variant,不能使用下标