VB变态应用活动:我最近写的FlashBit。

KiteGirl 2008-08-02 08:59:35
加精
资源下载:
http://d.download.csdn.net/down/566609/KiteGirl

FlashBit是我最想写而又一直没时间写的一个程序,今天一鼓作气把它捣鼓出来了。
这是在VB下实现对Bit操作的一组实用函数,是个把Byte肢解成若干Bit来操作的玩意儿,说它变态一点不过分。
这个程序看起来似乎有点吃饱了撑的,但实际上它相当有用。写它的动机来自于以VB编写哈夫曼编码/解码器和单片机应用的一些需求。VB下对Bit操作相当不方便,连移位命令都没有。而利用算数方法实现一些对Bit的操作在速度上实在难以忍受,而且代码及其冗长复杂。就这个程序本身来说,如果用纯算数方法实现,速度至少慢10倍,我是用一种比较缺德的查表法来实现的(将近9MB大的一个表,非常变态)。
至于它能做什么?比较典型的用途是做BASE64编码/解码器、哈夫曼编码/解码器,或者把信息藏在一个BMP文件像素的0位面里(据说本·拉登先生曾用这个办法通过互联网传递信息)。单色位图、采集点阵字库、GIF编码也会用到它。

这个程序有Simple和Professional两种。功能、速度完全一样。两者区别是:
Simple没有真正的计算函数,纯粹是查表,不能自己生成FlashBit_BSL_Buffer.dat;
Professional有真正的计算函数,可以自己生成甚至不用这个文件,为了实现这个功能则多了一大堆你看了之后想撞墙的代码。但那些代码除了生成FlashBit_BSL_Buffer.dat文件,压根不实用(速度比查表法要慢许多)。
考虑到代码的简洁,上面提供下载的是Simple。如果你想要Professional也不是不可以,我会在稍后贴出来的。

下面是这个模块里所有方法、函数的说明:

BytesBit_BitsPutToBytes方法
格式:tClass.BytesBit_BitsGetByBytes pBytes(), pBitsLoacte, pBitsValue, pBitsCount[, pHL_Logic][, pBoundLock]
功能:在字符串数组指定位写入指定位长的位值。
参数:byte pBytes() 被写入的字节数组。
long pBitsLoacte 起始位。取值范围(0 To 2^31)。
long pBitsCount 写位长。取值范围(-8 to 8)。
pBitsCount > 0 从起始位向右读;
pBitsCount < 0 从起始位向左读;
pBitsCount = 0 无效(不写入)
Boolean pHL_Logic 可选参数。位序逻辑。默认为False。
=True 书写顺序。
=False 逻辑顺序。
Boolean pBoundLock 可选参数。字节数组下标锁定。默认为True。
=True 不锁定字节数组下标。
=False 锁定字节数组下标。
返回:byte tByte 位值。
说明:1、pBytes()必须是下标从0开始的至少有一个元素的数组,否则会出错。
2、pBitsLoacte从0开始计数,不能是负值。pBitsLoacte上限可以超出实际字节数组所具备的位数。
3、pBoundLock=False的情况下,如pBitsLoacte前后位数不足pBitsCount定义的位长,则作如下处理:
pBitsCount > 0 取从起始位到第0位之间的位长,截取pBitsValue高位写入。
pBitsCount < 0 取从起始位到第7位之间的位长,截取pBitsValue低位写入。
pBoundLock=True的情况下,pBitsLoacte后位数不足会扩展字节数组以容纳写入的位。
但pBitsCount < 0的情况下,如pBitsLoacte前的位数不足则截取pBitsValue低位写入。
4、pHL_Logic=True 将字节最左边的位作为0位,以符合书写顺序。
pHL_Logic=False 将字节最右边的位作为0位,以符合逻辑顺序。

BytesBit_BitsGetByBytes函数
格式:[tByte] = tClass.BytesBit_BitsGetByBytes(pBytes(), pBitsLoacte, pBitsCount[, pHL_Logic])
功能:从字符串数组指定位读取指定位长的位值。
参数:byte pBytes() 字节数组。
long pBitsLoacte 起始位。取值范围(0 To 2^31)。
long pBitsCount 取位长。取值范围(-8 to 8)。
pBitsCount > 0 从起始位向右读;
pBitsCount < 0 从起始位向左读;
pBitsCount = 0 无效(返回0)
Boolean pHL_Logic 可选参数。位序逻辑。默认为False。
=True 书写顺序。
=False 逻辑顺序。
返回:byte tByte 位值。
说明:1、pBytes()必须是下标从0开始的至少有一个元素的数组,否则会出错。
2、pBitsLoacte从0开始计数,不能是负值。pBitsLoacte上限可以超出实际字节数组所具备的位数,返回0。
3、如果pLocate前后位数不足pBitsCount定义的位长,则作如下处理:
pBitsCount > 0 取从起始位到第0位之间的位,并后后面补足够的0。
pBitsCount < 0 取从起始位到第7位的位值。
4、pHL_Logic=True 将字节最左边的位作为0位,以符合书写顺序。
pHL_Logic=False 将字节最右边的位作为0位,以符合逻辑顺序。

BinaryText_SetToBytes函数
格式:[tBytes()] = tClass.BinaryText_SetToBytes(pText[, pLimit])
功能:将八位二进制字符串文本解码为字节数组。
参数:string pText 八位二进制字符串文本。
string pLimit 可选参数。八位二进制字符串之间的分隔符,默认为" "。
返回:byte tBytes() 字节数组。

BinaryText_GetByBytes函数
格式:[tString] = tClass.BinaryText_GetByBytes(pBytes()[, pLimit])
功能:将字节数组编码为八位二进制字符串。
参数:byte pBytes() 字节数组。
string pLimit 可选参数。八位二进制字符串之间的分隔符,默认为" "。
返回:string tString 八位二进制字符串文本。

BinaryString_FormatCheck函数
格式:[tBool] = tClass.BinaryString_FormatCheck(pString)
功能:检测八位二进制字符串的合法性。
参数:string pString 字节值的八位二进制字符串。
返回:boolean tBool True - 合法; False - 非法

BinaryString_SetToByte函数
格式:[tByte] = tClass.BinaryString_GetByByte(pString)
功能:从八位二进制字符串取得字节值。
参数:string pString 字节值的八位二进制字符串。
返回:byte tByte 字节值。

BinaryString_GetByByte函数
格式:[tString] = tClass.BinaryString_GetByByte(pByte)
功能:取字节值的八位二进制字符串。
参数:byte pByte 字节值。
返回:string tString 字节值的八位二进制字符串。

BinaryBits_Put函数
格式:[tOutByte] = tClass.BinaryBits_Put(pByte, pLocate, pCount, pValue)
功能:将指定长度的位值写入字节指定位置。
参数:byte pByte 原始字节。
long pLocate 起始位。取值范围(7 to 0)。
long pCount 写位长。取值范围(-8 to 8)。
pCount > 0 从起始位向右写;
pCount < 0 从起始位向左写;
pCount = 0 无效
byte pValue 写位值。
返回:byte pByte 写值后的字节。
说明:1、这是BinaryBits_MathPut的缓冲版函数。
2、缓冲函数不对参数值范围做任何检测,取值范围外的参数值会导致程序崩溃。
3、pLocate对一个字节的8个位序的定义为Bit7,Bit6,Bit5,Bit4,Bit3,Bit2,Bit1,Bit0
4、如果pLocate前后位数不足pCount定义的位长,则作如下处理:
pCount > 0 取从起始位到第0位之间的位长,截取pValue高位写入。
pCount < 0 取从起始位到第7位之间的位长,截取pValue低位写入。
5、如果pValue的值超过pCount定义的位长,则按pCount定位的位长截取低位。

BinaryBits_Get函数
格式:[tOutByte] = tClass.BinaryBits_Get(pByte, pLocate, pCount)
功能:从字节指定位置取指定位长的位值。
参数:byte pByte 源Byte。
long pLocate 起始位。取值范围(7 to 0)。
long pCount 取位长。取值范围(-8 to 8)。
pCount > 0 从起始位向右取;
pCount < 0 从起始位向左取;
pCount = 0 无效(返回0)
返回:byte pByte 位值。
说明:1、这是BinaryBits_MathGet的缓冲版函数。
2、缓冲函数不对参数值范围做任何检测,取值范围外的参数值会导致程序崩溃。
3、pLocate对一个字节的8个位序的定义为Bit7,Bit6,Bit5,Bit4,Bit3,Bit2,Bit1,Bit0
4、如果pLocate前后位数不足pCount定义的位长,则作如下处理:
pCount > 0 取从起始位到第0位之间的位,并后后面补足够的0。
pCount < 0 取从起始位到第7位的位值。

BinaryBits_Move函数
格式:[tOutByte] = tClass.BinaryBits_Move(pByte, pStep, [pLoop])
功能:对Byte进行算数移位。
参数:byte pByte 源Byte。
long pStep 移位数量。取值范围(-7 to 7)
pStep < 0 右移位
pStep = 0 不移位
pStep > 0 左移位
boolean pLoop 循环移位开关。取值范围(0,1)默认为0。
pLoop = 0 不循环
pLoop = 1 循环
返回:byte tOutByte 移位后的Byte。
说明:1、这是BinaryBits_MathMove的缓冲版函数。
2、缓冲函数不对参数值范围做任何检测,取值范围外的参数值会导致程序崩溃。
...全文
3338 83 打赏 收藏 转发到动态 举报
写回复
用AI写文章
83 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrgame 2012-04-24
  • 打赏
  • 举报
回复
litaoa 2012-04-22
  • 打赏
  • 举报
回复
不得不说。VB确实能做所有工作。但是有的东西实现起来确实很变态才行。

不得不说楼主也很变态。。。。

不看这个了。收藏了。以后用到再看。死脑细胞呀。
苦苦的潜行者 2011-08-04
  • 打赏
  • 举报
回复
我了个去,如何达到lz的深度
jjsu2007 2010-02-21
  • 打赏
  • 举报
回复
哥看的不是vb是寂寞
my13513480001 2010-02-20
  • 打赏
  • 举报
回复
【VB下实现对Bit操作的一组实用函数】
占位学习!
my13513480001 2010-02-20
  • 打赏
  • 举报
回复
引用 47 楼 wzuomin 的回复:
左移右移不是可以用 >>  和  < <  吗?

比如
        Dim test As Byte = 64
        MsgBox(test >> 2)

这是net中的用法么?
冰封猪 2009-12-27
  • 打赏
  • 举报
回复
up
IHUBO 2009-09-04
  • 打赏
  • 举报
回复
介个真的很牛逼哇
熊孩子开学喽 2009-04-23
  • 打赏
  • 举报
回复
查表确实非常快,不过可能我以前的用法有误,当表比较大的时候(大概15M左右),程序性能下降很多,当时我是把整个表全部读到一个动态数组中查的.后来作性能对比的时候发现比直接算还慢,于是就把精力花在算计优化上了.

希望能知道楼主是怎么查表的
authenticationf 2009-03-04
  • 打赏
  • 举报
回复
不懂,up
Rain208 2009-03-04
  • 打赏
  • 举报
回复
友情up
pushregistration 2009-02-16
  • 打赏
  • 举报
回复
友情up
yyydy324 2009-02-16
  • 打赏
  • 举报
回复
fl
  • 打赏
  • 举报
回复
VC写个DLL导出函数,用VB调用,比你的可靠强壮多少倍。
  • 打赏
  • 举报
回复
时间是很宝贵的,何必浪费在这上面?
welcomejack 2008-09-17
  • 打赏
  • 举报
回复
KiteGirl(小仙妹):
好妹妹,你真棒!你的FlashBit真的很不错!
我真的很受启发,也很受用!
谢谢!如果有机会一定很想认识一下你!
向你致敬!!!
褐色的 2008-09-17
  • 打赏
  • 举报
回复
看不懂
weijiepeng 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 liangqingzhi 的回复:]
冲着小仙妹这三个字来的:)
[/Quote]
jsfxina 2008-08-21
  • 打赏
  • 举报
回复
我来顶
plgo_go 2008-08-21
  • 打赏
  • 举报
回复
看见不少高人啊
加载更多回复(60)

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧