首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

二进制内容的轮换,有什么办法比较高效

2013-10-10 
二进制内容的替换,有什么办法比较高效?本帖最后由 bcrun 于 2013-08-04 12:56:47 编辑Private Sub Form_Lo

二进制内容的替换,有什么办法比较高效?
本帖最后由 bcrun 于 2013-08-04 12:56:47 编辑

Private Sub Form_Load()
Dim s As String
s = "中国abctt22"
Dim B() As Byte
B = StrConv(s, vbFromUnicode)
B = Replace(B, StrConv("abc", vbFromUnicode), StrConv("ddd", vbFromUnicode))
Dim s2 As String
s2 = StrConv(B, vbUnicode)

MsgBox s2
End Sub

以上代码,结果却是 “中国ddctt2”,什么原因?正角结果应该是中国dddtt22

比方有一段二进制数据,想按中间一段内容进行分隔成前后两段,用什么方法好?
要是字符串呢,可以用sz=split(str,"abc"),再取sz(0),sz(1)就行了,二进制内容要咋分隔比较快,主要是求高效的算法。

[解决办法]
楼主这是在胡写嘛。这replace的参数明明是string,你却非要用其它类型去搞,结果自然是
无法预料了

Function Replace(Expression As String, Find As String, Replace As String, [Start As Long = 1], [Count As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare]) As String
    VBA.Strings 的成员
    Find and replace a substring within a string

[解决办法]
Dim s As String, s2 As String

s = "中国abctt22"
Dim B() As Byte
B = StrConv(Replace(s, "abc", "ddd"), vbFromUnicode)
s2 = StrConv(B, vbUnicode)

MsgBox s2
Dim s As String, s2 As String, i As Integer

s = "中国abctt22"
Dim B() As Byte
B = StrConv(s, vbFromUnicode)
For i = LBound(B) To UBound(B) - 2
    If B(i) = Asc("a") And B(i + 1) = Asc("b") And B(i + 2) = Asc("c") Then
        B(i) = Asc("d")
        B(i + 1) = Asc("d")
        B(i + 2) = Asc("d")
        i = i + 2
    End If
Next i
s2 = StrConv(B, vbUnicode)
MsgBox s2

[解决办法]
这种需求不是编程的问题,而是你的功能设计思路的问题。设计阶段就要想好,到底替换时是处理unicode字符串还是字节数组,如是字节数组,还要考虑字符串的编码问题。
[解决办法]
自己写一个支持字节数组的Replace函数不就可以了,给你个我在vc里写的类似功能函数,你可以看看

LPWSTR ReplaceW(LPWSTR lpExpression,//
LPWSTR lpFind,//
LPWSTR lpReplacewith)//
{
DWORDi = 0;
DWORDj = 0;
DWORDELenB = 0;
DWORDFLenB = 0;
DWORDRLenB = 0;
DWORDisExec = 0;
LPWSTRretString;
ELenB = wcslen(lpExpression);
FLenB = wcslen(lpFind);
RLenB = wcslen(lpReplacewith);
retString = (LPWSTR)SKCreateMemory(ELenB*sizeof(WCHAR)+sizeof(WCHAR));
CopyStringW(retString, lpExpression, ELenB);
while((int)retString[i]!=0){
isExec = 1;
for(j=0;j<FLenB;j++){
if((WCHAR)retString[i+j]!=(WCHAR)lpFind[j]){
isExec = 0;
break;
}
}
if(isExec==1){
if(FLenB>RLenB){
CopyStringW(retString + i, lpReplacewith, RLenB);
CopyStringW(retString + (i + RLenB), retString + (i + FLenB), ELenB - (i + FLenB));
ELenB = ELenB - (FLenB - RLenB);
retString[ELenB] = 0;
retString = (LPWSTR)ZoomTextBufferW(retString, ELenB);
}else if(FLenB<RLenB){
ELenB = ELenB + (RLenB - FLenB);
retString = (LPWSTR)ZoomTextBufferW(retString, ELenB);
CopyStringRW(retString + (i + RLenB), retString + (i + FLenB), ELenB - (i + RLenB));
CopyStringW(retString + i, lpReplacewith, RLenB);
}else{
CopyStringW(retString + i, lpReplacewith, RLenB);
}
}
i++;
}
return NULL;
}

虽然看起来有些怪,很多函数被我定义了宏(为了跨平台代码的兼容性),不过基本上很容易看懂,特别是从vb的角度更容易理解。
SKCreateMemory 会根据情况分配出指定大小的内存空间(虽然有很多现成的东西可用,不过我还是自己做了一个内存管理模块,虽然也是用现成的东西,但这样避免了分配内存失效的可能,因为我做了很多处理,包括自己的虚拟内存管理等)
CopyStringW 复制字符串,虽然也有也有现成的函数可用,不过我自己用汇编写了一个,效率还挺高的,其功能就是字符串复制的过程,方式是从左到右的复制,还会自动设置结束符号 0x00 0x00
CopyStringRW 也是复制字符串,只不过是从右边开始向左边复制
ZoomTextBufferW 缩放字符串内存,有点像VB数组里用 redim preserve 缩放数组的感觉
其他的就是些基本的C语言,很容易看懂的。

------解决方案--------------------


return retString;
[解决办法]
可以找字符串的处理函数。

热点排行