比如有一个结构体
type g_g
   ID_G as long
   Name_G as string
end typesub form1_load
dim AA as g_g
AA.ID_G = 1
AA.Name_G = "GO"
dim BB as strimg '这里想把AA以二进制保存到BBdim CC as g_g'之后把BB以还原到CC
'CC.ID_G 的值为 1  CC.Name_G 的值为"GO"
         
'具体什么实现?????????????end sub

解决方案 »

  1.   

    BB是字符串变量,如何存"二进制"内容呢?就算复制内存进去,估计也会被VB自动处理成UNICODE......既然要保存,用字节数组吧.直接CopyMemory就行了-------不过要注意字符串长度.
      

  2.   

    参考一下吧。BB 用 String类型 的变量估计不太好。
    Option ExplicitPrivate Type g_g
       ID_G As Long
       Name_G As String
    End TypePrivate Sub Command1_Click()
        Dim AA As g_g
            AA.ID_G = 1
            AA.Name_G = "GO"
            
    Dim BB As String
    '这里想把AA以二进制保存到BB
        Dim i&, t&
        t = Len(AA.Name_G)
        BB = Space$(t + 4)
        Mid$(BB, 5, t) = AA.Name_G
        t = AA.ID_G
        For i = 1 To 4
            Mid$(BB, i, 1) = Chr$(t And 255)
            t = t \ 256
        Next'之后把BB以还原到CC
    Dim CC As g_g
    'CC.ID_G 的值为 1  CC.Name_G 的值为"GO"
    '具体什么实现?????????????
        t = 0
        For i = 4 To 1 Step -1
            t = t * 256 Or Asc(Mid$(BB, i, 1))
        Next
        CC.ID_G = t
        CC.Name_G = Mid$(BB, 5)
        Debug.Print CC.ID_G
        Debug.Print CC.Name_GEnd Sub
      

  3.   

    没老马想的那么复杂啦,老马适合解决复杂的问题.
    先把AA.ID_G = 1 换算成二进制,然后加个'.'然后把AA.Name_G = "GO"分为asc('G')和asc('O'),中间用','然后用函数转换为二进制存放起来
    后来在读取出来按照顺序转换回来就行啦.
    函数:
    Private   Function   TenturnTwo(ByVal   varNum   As   Long)   
      Dim   returnString   As   String,   ModNum   As   Integer   
      Do   While   varNum   >   0   
              ModNum   =   varNum   Mod   2   
              varNum   =   varNum   \   2   
              returnString   =   Trim(Str(ModNum))   +   returnString   
      Loop   
      TenturnTwo   =   returnString   
      End   Function   
        
      Private   Function   TwoturnTen(ByVal   varString   As   String)   
      Dim   SLen   As   Long,   I   As   Long,   returnNum   As   Long   
      SLen   =   Len(varString)   
      For   I   =   0   To   SLen   -   1   
              returnNum   =   returnNum   +   Val(Mid(varString,   I   +   1,   1))   *   (2   ^   (SLen   -   I   -   1))   
      Next   
      TwoturnTen   =   returnNum   
      End   Function   
        
      Private   Sub   Command1_Click()   
      Print   TenturnTwo(10)   
      Print   TwoturnTen("1010")   
      End   Sub   
    -------------------
    具体的你自己写吧...
      

  4.   

    但是文件可以用字符串变量打开哦?
    就好像,文件已打开的前提下
    dim PP as string 
    pp$ = input(4000,#1)
      

  5.   

    上面的代码看来是要改一下才行。Mid$(BB, i, 1) = Chr$(t And 255)  改成:Mid$(BB, i, 1) = ChrW$(t And 255)
    t = t * 256 Or Asc(Mid$(BB, i, 1)) 改成:t = t * 256 Or AscW(Mid$(BB, i, 1))
      

  6.   

    你的 g_g类型 中有 Long类型 的成员,它可以是任意的合法 Long值。
    如果把它‘转换成字符串’保存到磁盘文件中,再以String的形式读取,恐怕非常容易出问题。
      

  7.   

    楼主干吗不用 Binary 模式进行文件的 I/O 操作?
      

  8.   


    如果是用二进制文件格式保存呢?之后用String的形式读取,再以二进制文件格式保存String的形式读取的变量,再用g_g类型 读取这上二进制文件 应该就不会有错了?
      

  9.   

    Private Type g_g
       ID_G As Long
       Name_G As String
    End TypePrivate Sub Form_Load()
    Dim AA As g_g
    AA.ID_G = 1
    AA.Name_G = "GO"
    Dim BB As String
    Dim a(1) As Byte
    a(0) = Asc("G")
    a(1) = Asc("O")
    BB = CStr(a(0)) & "|" & CStr(a(1))
    Debug.Print BB
    Dim CC As g_g
    a1 = Split(BB, "|")
     CC.Name_G = Chr(Val(a1(0))) & Chr(Val(a1(1)))
     Debug.Print CC.Name_G
    End Sub
      

  10.   

    你的 g_g 类型的数据,直接用 Binary模式 进行操作就很方便啊,干吗非要去转一下?
    何况把 Long数据 转 String 类型很容易出问题。
      

  11.   


    Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Type g_g
       ID_G As Long
       Name_G As String * 255
    End TypePrivate Sub Form_Load()
        Dim AA As g_g
        
        AA.ID_G = 1
        AA.Name_G = "GO"    '保存AA到BB里
        Dim BB As String
        BB = String(Len(AA), vbNullChar)
        CopyMemory ByVal StrPtr(BB), AA, Len(AA)
        
        '从BB里还原数据到CC
        Dim CC As g_g
        CopyMemory CC, ByVal StrPtr(BB), Len(CC)
        
        Debug.Print CC.ID_G, RTrim(CC.Name_G)
    End Sub
      

  12.   

    Private Sub Form_Load()
        Dim AA As g_g
        AA.ID_G = 1
        AA.Name_G = "GO"
        
        Dim BB As String
        BB = Right$("00000000" & Hex(AA.ID_G), 8) & AA.Name_G
        Debug.Print BB
        
        Dim CC As g_g
        CC.ID_G = CLng("&H" & Left$(BB, 8))
        CC.Name_G = Mid$(BB, 9)
        Debug.Print CC.ID_G, CC.Name_G
    End Sub
      

  13.   

    type g_g
       ID_G as long
       Name_G as string 'string为不定长,不适合放在结构里
    end type
    '应改为12楼那样
    type g_g
       ID_G as long
       Name_G as string * 255
    end type