就是可以用诸如WinHex等十六进制编辑软件编辑的格式?
急!
急!
解决方案 »
- 如何将数据库指针移动到特定行?
- 关于SOCKET发送16进制数据
- 怎么计算text控件中有多少行啊?
- 一个简单的问题,请高手指教!!!!!!
- xyhv (乌龙茶) : 问一下,你是怎么解决ActiveReport 2.0 在2000上纸张设置的,急用!谢谢!
- 如何让键盘上的某一个键失效?
- 有关crystal reports 和 SQL Server 连接问题 ,拜托!在线等待
- 像数据库中写入日期时出错
- 使用脚本语言
- BARDO手稿:VB高手之路(1)(2)(3)VB初学者请进来
- 急:天津找和租,候台、华苑、王顶堤都可以。
- can't find DLL entry point ArriveTimePredict in ATPSystem.dll
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
我上面的函数可以将任何byte类型的数组转换为16进制表示的字符串;也可以将16进制字符串转换为byte。上面的函数就是为了写一个类似UltreEdit、PCTool、FPE那样的16进制编辑器而准备的。
如果你懂得Byte、二进制文件操作,应该不会再有任何疑问了。如果这样还做不出来,我劝你还是找别人帮你写这个软件吧。
附注:HEXStringGetByBytes函数最后两句tOutString = StrConv(tOutBytes(), vbUnicode)
HEXStringGetByBytes = tOutString有点问题,直接
HEXStringGetByBytes=StrConv(tOutBytes(), vbUnicode)会快得多,否则用时会增加0.2秒,上面测试出的1.3秒,是改过后的成绩
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进制字符串。
我曾经打算这么写一组函数,但是一直没想起来。不知道效率如何。
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
我都是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,我本来就先赞同小仙妹的用法,所以没有改动意见!
编译后的速度真是飞快,1M只需0.07秒,10M约2.5秒,可以和UEdit较量了^_^