就是可以用诸如WinHex等十六进制编辑软件编辑的格式?
急!

解决方案 »

  1.   

    Hex()函数把数字转换为十六进制字符
      

  2.   

    默认用HEX()函数,不要求速度的话够你用了。如果你觉得它速度慢,或者你有好几MB的东西要处理,我倒有个快速HEX算法。
      

  3.   

    下面是这种算法的演示,VB下速度虽然快,但还不足以体现出它的快。如果你用汇编、C来做,速度快得相当恐怖。Private priOutTable() As Byte           '公用导出表
    Private priInTable() As Byte            '公用导入表Private Sub Command1_Click()
      Dim tSurString As String              '输入字符串
      Dim tSurBytes() As Byte               '输入Bytes
      
      Dim tHEXString As String              'HEX字符串
      
      Dim tDesString As String              '输出字符串
      Dim tDesBytes() As Byte               '输出Bytes
          
      tSurString = "KiteGirl小仙妹是个好孩子"
      tSurBytes() = tSurString
      
      tHEXString = HEXStringGetByBytes(tSurBytes(), priOutTable())
      
      tDesBytes() = HEXStringPutToBytes(tHEXString, priInTable())
      tDesString = tDesBytes()
      
      Text1.Text = tSurString               '输入字符串
      Text2.Text = tHEXString               'HEX字符串
      Text3.Text = tDesString               '输出字符串
      Text4.Text = HEXStringGetByBytes(tDesBytes(), priOutTable())  '输出验证
    End SubPrivate Sub Command2_Click()
      Dim tBytes() As Byte
      ReDim tBytes(100000)
      Dim tString As String
      Dim tOnTimer As Double
      tOnTimer = Timer
      tString = HEXStringGetByBytes(tBytes(), priOutTable())
      Text1.Text = Abs(tOnTimer - Timer)
    End SubPrivate Sub Command3_Click()
      Dim tBytes() As Byte
      tBytes() = "小仙妹"
      Dim tBytes2() As Byte
      tBytes2() = "大乌龟是好孩子!"
      BytesCopy tBytes2(0), tBytes(0), 6
      Text1.Text = tBytes2()
    End SubPrivate Sub Form_Load()
      priOutTable() = OutTableGetByString   '初始化导出表。
      priInTable() = InTableGetByString     '初始化导入表。
    End Sub'原理:
    '设             B = &H5A 位于地址 I = 12
    '求高位         H = B \ &H10 = 5(&H5)
    '求低位         L = B Mod &H10 = 10(&HA)
    '已知导出映射表 T()
    '求输出量       OV1 = T(H) = 53(5的Ascii码)
    '               OV2 = T(L) = 65(A的Ascii码)
    '已知间隔符常量 S = 32(空格的Ascii码)
    '求输出量       OV3 = 32
    '求输出地址     OI1=I * 3 + 0 = 36 对应值 OV1 = 53
    '               OI2=I * 3 + 1 = 37 对应值 OV2 = 65
    '               OI3=I * 3 + 2 = 38 对应值 OV3 = 32
    '得到数组       {……53,65,32……}("5A "的Ascii编码,这个时候可以直接输出文本文件了。)
    '转换为String   StrConv({……53,65,32……},vbUnicode)
    '得到数组       {……53,00,65,00,32,00……}("5A "的UniCode编码)Function HEXStringPutToBytes(ByVal pString As String, ByRef pInTable() As Byte) As Byte()
      'HEXStringPutToBytes函数
      '语法:[tOutBytes()]=HEXStringPutToBytes(pString, pOutTable())
      '功能:将16进制字符串转换为Byte数组。
      '参数:   string  pString             HEX字符串。
      '         byte    pInTable()          导入表。可由InTableGetByString产生。
      '返回:   byte    tOutBytes()         Byte数组。
      Dim tOutBytes() As Byte
      Dim tOutBytes_Length As Byte
      
      Dim tInBytes() As Byte
      Dim tInBytes_Length As Byte
      
      tInBytes() = StrConv(pString, vbFromUnicode)
      tInBytes_Length = UBound(tInBytes())
      
      tOutBytes_Length = tInBytes_Length \ 3
      
      ReDim tOutBytes(tOutBytes_Length)
      
      Dim tIndex As Long
      Dim tInIndexH As Long
      Dim tInIndexL As Long
      Dim tOutByteH As Byte
      Dim tOutByteL As Byte
      Dim tOutByte As Byte
      
      For tIndex = 0 To tOutBytes_Length
        tInIndexH = tIndex * 3
        tInIndexL = tInIndexH + 1
        tOutByteH = pInTable(tInBytes(tInIndexH))
        tOutByteL = pInTable(tInBytes(tInIndexL))
        tOutByte = (tOutByteH * &H10) + (tOutByteL And &HF)
        tOutBytes(tIndex) = tOutByte
      Next
      
      HEXStringPutToBytes = tOutBytes()
    End Function
    Function HEXStringGetByBytes(ByRef pBytes() As Byte, ByRef pOutTable() As Byte, Optional ByVal pSpaceCode As Byte = 32) As String
      'HEXStringGetByBytes函数
      '语法:[tOutString]=HEXStringGetByBytes(pBytes(), pOutTable()[, pSpaceCode])
      '功能:将Byte数组转换为16进制字符串。
      '参数:   byte    pBytes()            Byte数组。
      '         byte    pOutTable()         导出表。可由OutTableGetByString产生。
      '         byte    pSpaceCode          间隔符Ascii,默认为空格32。
      '返回:   string  tOutString          以16进制表示的字符串。
      Dim tOutString As String
      
      Dim tOutBytes() As Byte
      Dim tOutBytes_Length As Long
      
      Dim tInBytes_Length As Long
      
      tInBytes_Length = UBound(pBytes())
      tOutBytes_Length = ((tInBytes_Length + 1) * 3) - 1
      
      ReDim tOutBytes(tOutBytes_Length)
      
      Dim tIndex As Long
      Dim tInValueH As Byte
      Dim tInValueL As Byte
      Dim tOutValue() As Byte
      ReDim tOutValue(2)
      
      Dim tValueIndex As Long
      Dim tOutIndex As Long
      
      For tIndex = 0 To tInBytes_Length
        tInValueH = pBytes(tIndex) \ &H10
        tInValueL = pBytes(tIndex) Mod &H10
        tOutValue(0) = pOutTable(tInValueH)
        tOutValue(1) = pOutTable(tInValueL)
        tOutValue(2) = pSpaceCode
        For tValueIndex = 0 To 2
          tOutIndex = tValueIndex + tIndex * 3
          tOutBytes(tOutIndex) = tOutValue(tValueIndex)
        Next
      Next
      
      tOutString = StrConv(tOutBytes(), vbUnicode)
      HEXStringGetByBytes = tOutString
    End FunctionFunction InTableGetByString(Optional pTableData As String = "0123456789ABCDEF") As Byte()
      '初始化导入表
      Dim tOutBytes() As Byte
      
      ReDim tOutBytes(255)
      
      Dim tIndex As Long
      
      Dim tValue As Byte
      
      For tIndex = 0 To 15
        tValue = Asc(Mid(pTableData, tIndex + 1, 1))
        tOutBytes(tValue) = tIndex
      Next
      
      InTableGetByString = tOutBytes()
    End FunctionFunction OutTableGetByString(Optional pTableData As String = "0123456789ABCDEF") As Byte()
      '初始化导出表。
      Dim tOutBytes() As Byte
      
      ReDim tOutBytes(15)
      
      Dim tIndex As Long
      
      For tIndex = 0 To 15
        tOutBytes(tIndex) = Asc(Mid(pTableData, tIndex + 1, 1))
      Next
      
      OutTableGetByString = tOutBytes()
    End Function
      

  4.   

    既然用C语言快,那么写成DLL来调用就可以了。写DLL比写MFC简单N倍哦!
      

  5.   

    大家还是没有明白的我的意思,我知道用Hex可以进行16进制转换,我的意思是怎么将其保存为那种格式!
      

  6.   

    都说到这份上还不明白我们就真没法再帮你了,除非你是要我们把这个软件全做出来。
    我上面的函数可以将任何byte类型的数组转换为16进制表示的字符串;也可以将16进制字符串转换为byte。上面的函数就是为了写一个类似UltreEdit、PCTool、FPE那样的16进制编辑器而准备的。
    如果你懂得Byte、二进制文件操作,应该不会再有任何疑问了。如果这样还做不出来,我劝你还是找别人帮你写这个软件吧。
      

  7.   

    KiteGirl(小仙妹)要吐血了,忙了半天白费劲,呵呵~
      

  8.   

    楼主意思是保存成以16进制数字为内容的txt文件?
      

  9.   

    这是个有趣的问题,KiteGirl(小仙妹)的代码,一开始觉得用了不少运算,且采用StrConv转换长串,速度应该不会太快,是不是用String数组,直接按字节转换并用Join连接会更快一些?我采用预算一个256大小的16进制字串表,对字节直接转换,与小仙妹的转换函数比较了一下结果很让我吃惊:转换1000000(约1M)长的Byte数组,我的代码用1.7秒,小仙妹用时1.3秒钦佩不已!看起来很复杂,但速度的确是快!
    附注:HEXStringGetByBytes函数最后两句tOutString = StrConv(tOutBytes(), vbUnicode)
    HEXStringGetByBytes = tOutString有点问题,直接
    HEXStringGetByBytes=StrConv(tOutBytes(), vbUnicode)会快得多,否则用时会增加0.2秒,上面测试出的1.3秒,是改过后的成绩
      

  10.   

    代码虽然复杂,道理很简单。以下列几个Byte为例子:假设有四个Byte,分别值为:&H5A &H6B &H7C &H12分别对每个字节取高四位和低四位。这样,每个字节与其16进制表达的字符串Byte有对应关系。每个字节I对应三个输出字节O1 O2 O3。假设有数组OT(),OT()有16个元素,分别对应0123456789ABCDEF的Ascii码。
    O1=OT(I \ 16)
    O2=OT(I Mod 16)
    O3=32上面的算法就是我提供函数所用的算法。由于VB是高级语言,所以用VB写上述算法的过程没有体现出优势。另外,我不知道homezj(小吉)测试时候是否编译为exe,编译之后的速度要快许多。在Celeron 433MHz的电脑下测试,1000000字节不编译用5秒,编译后是0.9秒。最后我再特别提醒一下:如果是想把文件的Byte直接输出为16进制表示的文本文件不需要StrConv函数,直接存盘就可以了。StrConv函数仅仅是为了把结果显示出来。上述算法如果有哪位用ASM或者C写一个出来,可能会更快。实际上还有一个更快的改进算法,只是代码暂时没找出来而已。简单原理是这样的:如果将取高4位和低4位的函数看成这种形式:F(V,B),V为0-255的Byte值、B为0-1表示高底位。则这个函数可以用512字节的二维数组A(V,B)表示。还有一个办法是这样的:
    先做一个768字节的Byte数组T,按照H L S H L S H L S,H=高位Ascii、L=低位Ascii、S=32的格式实现存储好一个转换表。然后取输入数组第I个Byte的值BV(I),用API函数CopyMemory从T()的第BV*3个字节取3个字节,写到输出Byte数组的第I*3个字节。这样得到的是Ascii编码的16进制字符串。
    我曾经打算这么写一组函数,但是一直没想起来。不知道效率如何。
      

  11.   

    这是后面提到的那种算法,就是CopyMemory那个。Celeron 433下测试,1000000字节,不编译1.7秒,编译后0.7秒。Private Sub Command1_Click()
      Text1.Text = StrConv(HexTableCreate(), vbUnicode)
    End SubPrivate Sub Command2_Click()
      Dim tBytes() As Byte
      Dim tOutBytes() As Byte
      priSumTable() = SumTableCreate
      priHexTable() = HexTableCreate
      tBytes() = "KiteGirl小仙妹是个好孩子!"
      ReDim tBytes(9)
      For I = 0 To 9
        tBytes(I) = I
      Next
      tOutBytes() = HEXBytesGetByBytes(tBytes())
      Text1.Text = StrConv(tOutBytes(), vbUnicode)
    End SubPrivate Sub Command3_Click()
      Dim tBytes() As Byte
      ReDim tBytes(1000000)
      Dim tOutBytes() As Byte
      Dim tOnTimer As Double
      priSumTable() = SumTableCreate
      priHexTable() = HexTableCreate
      
      tOnTimer = Timer
      tOutBytes() = HEXBytesGetByBytes(tBytes())
      Text1.Text = Timer - tOnTimer
    End Sub下面需要复制到公共模块里。Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Public priSumTable() As Long
    Public priHexTable() As ByteFunction HEXBytesGetByBytes(ByRef pBytes() As Byte) As Byte()
      Dim tOutBytes() As Byte
      
      Dim tBytes_Length As Long
      Dim tBytes_Index As Long
      
      tBytes_Length = UBound(pBytes())
      
      ReDim tOutBytes((tBytes_Length + 1) * 3 - 1)
      
      Dim tValueIndex As Long
      Dim tOutIndex As Long
      
      For tBytes_Index = 0 To tBytes_Length
        tValueIndex = priSumTable(pBytes(tBytes_Index))
        tOutIndex = tBytes_Index * 3
        CopyMemory tOutBytes(tOutIndex), priHexTable(tValueIndex), 3
      Next
        
      HEXBytesGetByBytes = tOutBytes()
    End FunctionFunction SumTableCreate() As Long()
      Dim tOutLongs() As Long
      
      ReDim tOutLongs(255)
      
      Dim tIndex As Long
      
      For tIndex = 0 To 255
      
        tOutLongs(tIndex) = tIndex * 3
      
      Next
      
      SumTableCreate = tOutLongs()
    End FunctionFunction HexTableCreate(Optional ByVal pSpace As Byte = 32) As Byte()
      Dim tOutBytes() As Byte
      Dim tOutBytes_Length As Long
      Dim tOutBytes_Index As Long
      
      Dim tCodeTable As String
      Dim tIndex As Long
      
      tCodeTable = "0123456789ABCDEF"
      tOutBytes_Length = (3 * 256) - 1
      
      ReDim tOutBytes(tOutBytes_Length)
      
      For tIndex = 0 To 255
        tOutBytes_Index = tIndex * 3
        tOutBytes(tOutBytes_Index) = Asc(Mid(tCodeTable, (tIndex \ 16) + 1, 1))
        tOutBytes(tOutBytes_Index + 1) = Asc(Mid(tCodeTable, (tIndex Mod 16) + 1, 1))
        tOutBytes(tOutBytes_Index + 2) = pSpace
      Next
      
      HexTableCreate = tOutBytes()
    End Function
      

  12.   

    试了一下,又快了不少,前面在机器上为1.3秒的,这个代码只用0.5秒!
    我都是IDE环境测试的,象这类大循环代码,本机码编译后常会快7-10倍。不过,我一直在想一个问题,String To Byte用此法应该是绝对正确,因为VB的内部对String的类型转换实在是慢,但Byte To String似乎有点绕路,毕竟可用一个简单的256大小的表,对Byte进行预处理。前面我想用Join连接路走错了,那还是要进行String的再分配,很耗时,为什么不用填充方式呢?基于这个想法,我写了一个Byte To String的代码,哈!同样的1000000数组,用时只有0.25秒!交流一下:
    Private StrTable() As String            '公用Byte To String转换表Private Sub Command1_Click()
      Dim tSurString As String              '输入字符串
      Dim tSurBytes() As Byte               '输入Bytes
      
      Dim tHEXString As String              'HEX字符串
          
      tSurString = "KiteGirl小仙妹是个好孩子"
      tSurBytes() = StrConv(tSurString, vbFromUnicode)
      tHEXString = HEXStringGetByBytes1(tSurBytes(), StrTable)
      Text1.Text = tSurString               '输入字符串
      Text2.Text = tHEXString               'HEX字符串
    End SubPrivate Sub Command2_Click()
      Dim tBytes() As Byte
      ReDim tBytes(1000000)
      Dim tString As String
      Dim tOnTimer As Double
      tOnTimer = Timer
      tString = HEXStringGetByBytes1(tBytes(), StrTable())
      Text1.Text = Abs(tOnTimer - Timer)
      Debug.Print Len(tString)
    End SubPrivate Sub Form_Load()
      StrTable() = StringTable     '初始化导入表。
    End SubFunction HEXStringGetByBytes1(ByRef pBytes() As Byte, ByRef pOutTable() As String) As String
      Dim tOutString As String
      Dim tOutBytes() As String
      Dim tInBytes_Length As Long
      Dim tIndex As Long
      tInBytes_Length = UBound(pBytes())
      tOutString = Space$((tInBytes_Length + 1) * 3 - 1)
      For tIndex = 0 To tInBytes_Length
            Mid$(tOutString, tIndex * 3 + 1, 2) = pOutTable(pBytes(tIndex))
      Next
      HEXStringGetByBytes1 = tOutString
    End FunctionFunction StringTable() As String()
      '初始化表
      Dim tOutBytes() As String
      ReDim tOutBytes(255)
      Dim tIndex As Long
      For tIndex = 0 To 255
            tOutBytes(tIndex) = Hex$(tIndex)
            If Len(tOutBytes(tIndex)) = 1 Then tOutBytes(tIndex) = "0" & tOutBytes(tIndex)
      Next
      StringTable = tOutBytes()
    End Function关于String To Byte,我本来就先赞同小仙妹的用法,所以没有改动意见!
      

  13.   

    小仙妹第一次的算法是基于“半字节”转换,第二次是基于整字节加分隔符方式整体转换,似乎都是有意回避VB中最慢的String处理,其实我这个方案与小仙妹的第二次的办法有些雷同,不过我是直接用String填充一个字节对应的String,不是按Byte进行3字节填充,为什么会快了1倍多?我的分析是:VB的String处理的确很慢,但它慢在赋值与连接上,VB的String每次赋值与连接都要重新申请内存,整体Copy另存,其速度当然会越来越慢,但填充就不同,String只需一次申请空间,没有Copy另存操作,效率提高就在情理之中了。我还试过用CopyMemory填充String,IDE下测试比Mid$填充只快5%,可编译后,就比Mid慢40%了!
    编译后的速度真是飞快,1M只需0.07秒,10M约2.5秒,可以和UEdit较量了^_^