内存中压缩数组的二种办法

原创 2007年10月15日 14:48:00

到底压缩数组有什么好处我就不多说了,直接看代码吧

1 利用zlibwapi.dll(网上到处都有下载的,还有C的源码)
注:利用代码 转自“http://blog.csdn.net/modest/archive/2006/04/13/662072.aspx”
魏滔序原创
提示:DLL记得要先注册哦
'-------------------------------------------代码如下------------------------------------------------------------

Option Explicit
'Declares
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function Compress Lib "zlibwapi.dll" Alias "compress" (dest As Any, destLen As Any, src As Any, ByVal srcLen As Long) As Long
Private Declare Function uncompress Lib "zlibwapi.dll" (dest As Any, destLen As Any, src As Any, ByVal srcLen As Long) As Long

Private Const OFFSET As Long = &H8

'压缩数组
Public Function CompressByte(ByteArray() As Byte) As Boolean
    Dim BufferSize As Long
    Dim TempBuffer() As Byte
    'Create a buffer to hold the compressed data
    BufferSize = UBound(ByteArray) + 1
    BufferSize = BufferSize + (BufferSize * 0.01) + 12
    ReDim TempBuffer(BufferSize)

    'Compress byte array (data)
    CompressByte = (Compress(TempBuffer(0), BufferSize, ByteArray(0), UBound(ByteArray) + 1) = 0)

    'Add the size of the original data
    Call CopyMemory(ByteArray(0), CLng(UBound(ByteArray) + 1), OFFSET)

    'Remove redundant data
    ReDim Preserve ByteArray(0 To BufferSize + OFFSET - 1)
    CopyMemory ByteArray(OFFSET), TempBuffer(0), BufferSize
End Function

'解压缩数组
Public Function UnCompressByte(ByteArray() As Byte) As Boolean
    Dim OrigLen As Long
    Dim BufferSize As Long
    Dim TempBuffer() As Byte
    'Get the original size
    Call CopyMemory(OrigLen, ByteArray(0), OFFSET)

    'Create a buffer to hold the uncompressed data
    BufferSize = OrigLen
    BufferSize = BufferSize + (BufferSize * 0.01) + 12
    ReDim TempBuffer(BufferSize)

    'Decompress data
    UnCompressByte = (uncompress(TempBuffer(0), BufferSize, ByteArray(OFFSET), UBound(ByteArray) - OFFSET + 1) = 0)

    'Remove redundant data
    ReDim Preserve ByteArray(0 To BufferSize - 1)
    CopyMemory ByteArray(0), TempBuffer(0), BufferSize
End Function

'-----------------------------------------------------------------------------------------------------------------------------

2 改良一个俄罗斯的算法,是一位CSDN的朋友改的,我偶然得之。
效率一般,速度可以接受,唯一的缺点是不支持已压缩或加壳的EXE,处理单纯的BYTE()肯定是没问题

'-------------------------------------------代码如下------------------------------------------------------------

Option Explicit
'Declares
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function Compress Lib "zlibwapi.dll" Alias "compress" (dest As Any, destLen As Any, src As Any, ByVal srcLen As Long) As Long
Private Declare Function uncompress Lib "zlibwapi.dll" (dest As Any, destLen As Any, src As Any, ByVal srcLen As Long) As Long

Private Const OFFSET As Long = &H8

'压缩数组
Public Function CompressByte(ByteArray() As Byte) As Boolean
    Dim BufferSize As Long
    Dim TempBuffer() As Byte
    'Create a buffer to hold the compressed data
    BufferSize = UBound(ByteArray) + 1
    BufferSize = BufferSize + (BufferSize * 0.01) + 12
    ReDim TempBuffer(BufferSize)

    'Compress byte array (data)
    CompressByte = (Compress(TempBuffer(0), BufferSize, ByteArray(0), UBound(ByteArray) + 1) = 0)

    'Add the size of the original data
    Call CopyMemory(ByteArray(0), CLng(UBound(ByteArray) + 1), OFFSET)

    'Remove redundant data
    ReDim Preserve ByteArray(0 To BufferSize + OFFSET - 1)
    CopyMemory ByteArray(OFFSET), TempBuffer(0), BufferSize
End Function

'解压缩数组
Public Function UnCompressByte(ByteArray() As Byte) As Boolean
    Dim OrigLen As Long
    Dim BufferSize As Long
    Dim TempBuffer() As Byte
    'Get the original size
    Call CopyMemory(OrigLen, ByteArray(0), OFFSET)

    'Create a buffer to hold the uncompressed data
    BufferSize = OrigLen
    BufferSize = BufferSize + (BufferSize * 0.01) + 12
    ReDim TempBuffer(BufferSize)

    'Decompress data
    UnCompressByte = (uncompress(TempBuffer(0), BufferSize, ByteArray(OFFSET), UBound(ByteArray) - OFFSET + 1) = 0)

    'Remove redundant data
    ReDim Preserve ByteArray(0 To BufferSize - 1)
    CopyMemory ByteArray(0), TempBuffer(0), BufferSize
End Function

将RGB数组在内存中压缩成JPEG文件

将RGB数组在内存中压缩成JPEG文件 0.   环境 1)       jpeg库: jpegsr9a  下载地址:http://www.ijg.org/ 2)       编译环境: vs2...
  • zzzzzqf
  • zzzzzqf
  • 2014年07月08日 20:10
  • 1263

数组及矩阵的压缩存储

数据结构中的线性结构包括线性表,栈和队列
  • CassieHu
  • CassieHu
  • 2014年07月03日 22:09
  • 2072

“系统和压缩内存”导致电脑卡顿问题

win10系统“系统和压缩内存”占用大量资源导致电脑卡顿。可能是声音相关驱动导致,可能是虚存导致。...
  • leizhijie_csdn
  • leizhijie_csdn
  • 2016年09月21日 15:02
  • 4425

数据压缩 压缩字节数组和文件

 转自:http://www.cnblogs.com/yank/p/Compress.html 感谢博主分享 在进行文件存储或者数据传输时,为了节省空间流量,需要对数据或文件进行压缩。在这里我...
  • hutao1101175783
  • hutao1101175783
  • 2016年06月29日 16:33
  • 1195

系统和压缩内存 NT Kernel 80端口被pid=4的进程占用,清除NT Kernel占用

当一台电脑安装了vs又安装了xampp时,可以能发生80端口号冲突,导致不能两个同时可以,这篇文章介绍如何在两者切换。 1 运行'netstat -ano'发现80端口被pid=4的进程占用。 2...
  • meimeieee
  • meimeieee
  • 2017年01月01日 16:44
  • 2108

常见的八种导致 APP 内存泄漏的问题

像 Java 这样具有垃圾回收功能的语言的好处之一,就是程序员无需手动管理内存分配。这减少了段错误(segmentation fault)导致的闪退,也减少了内存泄漏导致的堆空间膨胀,让编写的代码更加...
  • katydid3018
  • katydid3018
  • 2017年06月03日 17:53
  • 206

linux内存源码分析 - 内存压缩(同步关系)

概述    最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也那么复杂吧,带着好奇心就把页面迁移的源码都大致看了一遍,还好,不复杂,也容易...
  • wh8_2011
  • wh8_2011
  • 2016年08月23日 07:29
  • 459

Zlib内存数据压缩和解压缩

前言现在要将抓图数据传到另外一台计算机,首先要解决的是将BMP数据压缩. BMP的压缩率是很大的, 如果不压缩,没办法往下做了. 当前Zlib版本是2013年出的1.2.8, 先做个静态库, 将....
  • LostSpeed
  • LostSpeed
  • 2016年04月11日 00:26
  • 1592

oracle把表数据放入内存

Oracle's buffer cache   The buffer cache is part of the SGA. It holds copies of data blocks so as ...
  • yaoxinook
  • yaoxinook
  • 2015年07月28日 11:31
  • 441

int类型数组压缩为char类型数组存储

本文以C++语言实现int数组压缩存储以及解压缩取出的例子。 原理:int类型数占16位,char类型占8位。int转为char默认保留低八位。 #include using namespace...
  • qq_29606255
  • qq_29606255
  • 2017年11月28日 20:53
  • 41
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存中压缩数组的二种办法
举报原因:
原因补充:

(最多只允许输入30个字)