








X99-EATX愛两正方SOCKET-2011散熱. 唔諗買『熱導管散熱』.學上次咁買两拆機銅散熱,正方『90mm*90mm』, 配两『AVC-9025-12V-0.13A』.風扇底座用3D打印. 尺寸太大ABS容易收縮變形.
BOOKCARD
電腦
X99-EATX愛两正方SOCKET-2011散熱. 唔諗買『熱導管散熱』.學上次咁買两拆機銅散熱,正方『90mm*90mm』, 配两『AVC-9025-12V-0.13A』.風扇底座用3D打印. 尺寸太大ABS容易收縮變形.
舊時『游戲紋理』再用『.bmp格式』, 冇壓缩即使256色盤依然佔用吉間.
『.PNG格式』利LZ77且冇失真壓縮. 且壓縮極高, 配合256色盤,适宜作『游戲紋理』.
數據塊 | 數值 |
PNG圖檔標誌 | 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A |
圖檔頭 | IHDR |
调色板 | PLTE |
图像数据 | IDAT |
图像结束 | IEND |
PNG數據塊基本結构.
數據塊結构 | size | 簡介 |
LENGTH | 整數4字節 | 數據長度 |
CHUNK TYPE | 整數4字節 | 類型標記 |
CHUNK DATA | 0~2^32字節 | 數據 |
CRC32 | 整數4字節 | CRC32校驗 |
两字節肆字節數據,冚辦闌用『網络字節』存儲,需轉『主機字節』.
『網络字節』轉『主機字節』 |
#define PNG_VALUE32(v) ((v & 0xff000000) >> 24 | (v & 0x00ff0000) >> 8 | (v & 0x0000ff00) << 8 | (v & 0x000000ff) << 24) |
#define PNG_VALUE16(v) ((v & 0xff00) >> 8 | (v & 0x00ff) << 8) |
游戲引擎需讀PNG 伍個數據塊
PNG數據塊 | 功能簡介 |
IHDR | 文檔頭 |
PLTE | 色盤 |
IDAT | 圖像數值 |
IEND | 結束 |
tRNS | 圖像透明 |
bKGD | 背景色 |
PNG圖檔頭捌字節標記,愛蒞識别PNG
0x89 | 0x50 | 0x4E | 0x47 | 0x0D | 0x0A | 0x1A | 0x0A |
137 | P | N | G | \r | \n | 26 | \n |
對比PNG標識
if(memcmp(data, 0x0A1A0A0D474E5089, 8) != 0)
return false;// 非png圖檔 |
CRC32計算必需計『CHUNK TYPE + CHUNK DATA』, 長度『length + 4』而得.
DWORD length = PNG_VALUE32(chunk->length) + 4; | 長 |
DWORD64 crc = CRC32((PBYTE)(chunk) + 4,length); | CRC32計算 |
DWORD64 crc_ = PNG_VALUE32(chunk->crc_); | 轉主機字節 |
if(crc_ == crc)
return true;
|
比較crc值 |
首先定義PNG結构
typedef struct PNG_TAG{ | |
int width; | 圖宽 |
int height; | 圖高 |
int bitCount; | 位圖像素bits 8位,16位,24位,32位 |
PNG_RGBA palette[256]; | 调色板 |
PBYTE buffer; | 圖像数据 |
int buffer_size; | 圖像数据長度 |
int length; | 临時變量 |
z_stream stream; | ZLIB解壓 |
} PNG, *PNG_PTR; |
文檔頭結构 IHDR
typedef struct PNG_IHDR_TAG{ | 文檔頭 IHDR |
int length; | Data長度 |
DWORD type; | 標記’IHDR’ |
DWORD width; | 像素寬 |
DWORD height; | 像素高 |
BYTE BitDepth; | 圖像深度 |
BYTE ColorType; | 顏色類型 |
BYTE Compression; | LZ77派生演算法 ,壹定係0 |
BYTE Filter; | 濾波,止值定0. 事實『0,1,2,3,4』伍種濾波 |
BYTE Interlace; | 隔行掃描0=冇掃描,1=(Adam7 interlace) |
DWORD CRC32; | CRC32校驗 |
}PNG_IHDR,*PNG_IHDR_PTR; |
PNG支緩伍款顏色類型
ColorType | 顏色類型 | 像素 |
0=Greyscale | 灰度圖像 | 1,2,4,8,16bit |
2=Truecolour | 真彩色圖像 | 8,16bit |
3=Indexed-colour | 索引彩色圖像 | 1,2,4,8bit |
4=Greyscale with alpha | 帶α通道資料灰度圖像 | 8,16bit |
6=Truecolour with alpha | 帶α通道資料真彩色圖像 | 8,16bit |
像素排列
ColorType | 像素排列 |
Greyscale | Y |
Truecolour | RGB |
Indexed-colour | i |
Greyscale with alpha | RGBA |
Truecolour with alpha | YA |
解析文檔頭 IHDR, 分配圖像時分, 每行像素多壹字節,記錄『Filter』濾波值,『0,1,2,3,4』伍種濾波;
if(IHDR->ColorType == 0)
png->bitCount = IHDR->BitDepth; |
0:Greyscale:灰度圖像,1,2,4,8,16bit |
if(IHDR->ColorType == 2)
png->bitCount = IHDR->BitDepth * 3; |
2:Truecolour:真彩色圖像,8,16bit |
if(IHDR->ColorType == 3)
png->bitCount = IHDR->BitDepth; |
3:Indexed-colour:索引彩色圖像,1,2,4,8bit |
if(IHDR->ColorType == 4)
png->bitCount = IHDR->BitDepth * 2; |
4:Greyscale with alpha:帶α通道資料灰度圖像,8,16bit |
if(IHDR->ColorType == 6)
png->bitCount = IHDR->BitDepth * 4; |
6:Truecolour with alpha:帶α通道資料真彩色圖像,8,16bit |
png->width = PNG_VALUE32(IHDR->width); | 像素寬 |
png->height = PNG_VALUE32(IHDR->height); | 像素高 |
int byte_count = (float)png->bitCount / 8.0f; | 像素大小 BIT to BYTE |
png->buffer_size = (png->width * png->height * byte_count) + (png->height * 1); | 圖像数据長度,每行多壹字節 |
png->buffer = (PBYTE)malloc(png->buffer_size); | 圖像数据 |
定義色盤RGB
typedef struct PNG_RGB_TYP { | 色盤3字節 |
BYTE red; | 紅 |
BYTE green; | 錄 |
BYTE blue; | 蓝 |
} PNG_RGB, *PNG_RGB_PTR; |
定義色盤RGBA
typedef struct PNG_RGBA_TYP { | 色盤4字節 |
BYTE red; | 紅 |
BYTE green; | 錄 |
BYTE blue; | 蓝 |
BYTE alpha; | 透明混合,透明0x00~實體0xFF |
} PNG_RGBA, *PNG_RGBA_PTR; |
定義PNG色盤結构 ‘PLTE’
typedef struct PNG_PLTE_TYP { | |
int length; | Data長度 |
DWORD type; | 標記’PLTE’ |
PNG_RGB palette[256]; | 至多256色盤 |
DWORD CRC32; | CRC32校驗 |
} PNG_PLTE, *PNG_PLTE_PTR; |
分析PNG色盤 ‘PLTE’
int length = PNG_VALUE32(chunk->length); | 長度 |
int count = length / 3; | 色盤量 |
for(int index = 0; index < count; ++index){ | |
png->palette[index].red = PLTE->palette[index].red ; | 紅 |
png->palette[index].green = PLTE->palette[index].green ; | 錄 |
png->palette[index].blue = PLTE->palette[index].blue ; | 蓝 |
png->palette[index].alpha = 0xff; } | 透明0x00~實體0xFF |
定義透明像素結构’tRNS’
typedef struct PNG_tRNS_TYP{ | |
int length; | 數據長度 |
DWORD type; | 標記’tRNS’ |
union { | |
WORD grey; | 顏色類型 0 |
struct {WORD Red,Green,Blue;}; | 顏色類型 2 |
BYTE palette[256]; | 顏色類型 3 |
DWORD CRC32; | CRC32校驗 |
}PNG_tRNS,*PNG_tRNS_PTR; |
分析透明像素
PNG_tRNS_PTR tRNS; | 透明像素 |
tRNS->length = PNG_VALUE32(tRNS->length); | 數據長度 |
if(IHDR->ColorType == 0 )
tRNS->grey = PNG_VALUE16(tRNS->grey); |
0:Greyscale:灰度圖像,1,2,4,8,16bit |
if(IHDR->ColorType == 2 ) {
tRNS->Red = PNG_VALUE16(tRNS->Red); tRNS->Green = PNG_VALUE16(tRNS->Green); tRNS->Blue = PNG_VALUE16(tRNS->Blue); } |
2:Truecolour:真彩色圖像,8,16bit |
if(IHDR->ColorType == 3) {
length = tRNS->length; for(int i = 0; i < length; ++i) { index = tRNS->palette[i]; png->palette[index].alpha = 0x00; } |
3:Indexed-colour:索引彩色圖像,1,2,4,8bit
透明0x00~實體0xFF |
定義背景色結构 ‘bKGD’
typedef struct PNG_bKGD_TYP{ | |
int length; | Data長度 |
DWORD type; | 標記’bKGD’ |
union { | |
WORD Greyscale; | 顏色類型0 and 4灰度 |
struct{WORD Red,Green,Blue;}; | 顏色類型2 and 6 -RGB三色 |
BYTE Palette_Index;}; | 顏色類型3色盤索引 |
DWORD CRC32; | CRC32校驗 |
}PNG_bKGD,*PNG_bKGD_PTR; |
分析背景色’bKGD’
int length = PNG_VALUE32(bKGD->length); | 長度 |
if(IHDR->ColorType == 0 || IHDR->ColorType == 4)
bKGD->Greyscale = PNG_VALUE16(bKGD->Greyscale); |
灰度圖像 – 帶α通道資料灰度圖像 |
if(IHDR->ColorType == 2 || IHDR->ColorType == 6) {
bKGD->Red = PNG_VALUE16(bKGD->Red); bKGD->Green = PNG_VALUE16(bKGD->Green); bKGD->Blue = PNG_VALUE16(bKGD->Blue); } |
真彩色圖像 – 帶α通道資料真彩色圖像 |
if(IHDR->ColorType == 3)
bKGD->Palette_Index = bKGD->Palette_Index; |
索引彩色圖像 |
定義圖像數值結构 ‘IDAT’, 止數據塊可能有多個.
typedef struct PNG_IDAT_TYP { | |
int length; | Data長度 |
DWORD type; | 標記’PLTE’ |
BYTE data[1]; | 經壓縮圖像數據 |
DWORD CRC32; | CRC32校驗 |
} PNG_IDAT, *PNG_IDAT_PTR; |
每行像素多壹字節,記錄『Filter』濾波值,『0,1,2,3,4』伍種濾波;
int length = PNG_VALUE32(IDAT->length); | 長度 |
int size = png->buffer_size – png->length; | 剩余記憶體 |
Uncompress_Data_gZip(png->buffer + png->length, &size,
IDAT->data,length, &png->stream); |
解压 |
png->length = png->length + size; | 累積積數據長度 |
結束 IEND,檢測到’IEND’數據塊,己到文檔未端.
typedef struct PNG_IEND_TAG{ | |
int length; | Data長度0 |
DWORD type; | 標記’IEND’ |
DWORD CRC32; | CRC32校驗 |
}PNG_IEND, *PNG_IEND_PTR; |
以顏色類型分別進行『反濾波』, 係每行像素首字節『濾波』值,有『0,1,2,3,4』伍款濾波, 以每粒像素單獨『復位』,帶α通道真彩色圖像8bit為例.
以cbax像素排列支缓伍款濾波
c | b |
a | x |
濾波算法
filter濾波 | 濾波 | 復位 |
0= None | Filt(x) = Orig(x) | Recon(x) = Filt(x) |
1= Sub | Filt(x) = Orig(x) – Orig(a) | Recon(x) = Filt(x) + Recon(a) |
2= Up | Filt(x) = Orig(x) – Orig(b) | Recon(x) = Filt(x) + Recon(b) |
3= Average | Filt(x) = Orig(x) – floor((Orig(a) + Orig(b)) / 2) | Recon(x) = Filt(x) + floor((Recon(a) + Recon(b)) / 2) |
4= Paeth | Filt(x) = Orig(x) – PaethPredictor(Orig(a), Orig(b), Orig(c)) | Recon(x) = Filt(x) + PaethPredictor(Recon(a), Recon(b), Recon(c)) |
復位算法
int byte_count = 4; | 每粒像素4字節 |
int pixel_size = png->width * png->height; | 總像素量 |
int buffer_size = png->width * png->height * byte_count; | 總字節量 |
PBYTE buffer = (PBYTE)malloc(buffer_size); | 反濾波影像數據 |
int col_size_recon = (png->width * 4) ; | 復位後每行字節量 |
int col_size_filt = (png->width * 4) + 1; | 濾波後每行字節量 |
for(int j = 0; j < png->height ; ++j) | 每行像素 |
int filter = png->buffer[col_size_filt * j]; | 行首濾波=1 byte |
處理filter濾波0= None
if(filter == 0) { | None |
for(int i = 0; i < png->width; ++i){ | 逐像素復位 |
Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
buffer[(col_size_recon * j) + (i * 4) + 0] = Red; | 復位像素紅色 |
buffer[(col_size_recon * j) + (i * 4) + 1] = Green; | 復位像素藍色 |
buffer[(col_size_recon * j) + (i * 4) + 2] = Blue; | 復位像素綠色 |
buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha; }} | 復位像素透明 |
處理filter濾波1 =Sub
if(filter == 1) { | Sub |
for(int i = 0; i < png->width; ++i){ | 逐像素復位 |
Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
aRed = aGreen = aBlue = aAlpha = 0; | 清零 |
if(i > 0) { | |
aRed = buffer[(col_size_recon * j) + ((i-1) * 4) + 0]; | a像素紅色 |
aGreen = buffer[(col_size_recon * j) + ((i-1) * 4) + 1]; | a像素藍色 |
aBlue = buffer[(col_size_recon * j) + ((i-1) * 4) + 2]; | a像素綠色 |
aAlpha = buffer[(col_size_recon * j) + ((i-1) * 4) + 3]; } | a像素透明 |
buffer[(col_size_recon * j) + (i * 4) + 0] = Red + aRed; | 復位像素紅色 |
buffer[(col_size_recon * j) + (i * 4) + 1] = Green + aGreen; | 復位像素藍色 |
buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + aBlue; | 復位像素綠色 |
buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + aAlpha; }} | 復位像素透明 |
處理filter濾波2 =Up
if(filter == 2){ | Up |
for( i = 0; i < png->width; ++i){ | 逐像素復位 |
Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
bRed = bGreen = bBlue = bAlpha = 0; | 清零 |
if(j > 0) { | |
bRed = buffer[(col_size_recon * (j-1)) + (i * 4) + 0]; | b像素紅色 |
bGreen = buffer[(col_size_recon * (j-1)) + (i * 4) + 1]; | b像素藍色 |
bBlue = buffer[(col_size_recon * (j-1)) + (i * 4) + 2]; | b像素綠色 |
bAlpha = buffer[(col_size_recon * (j-1)) + (i * 4) + 3];} | b像素透明 |
buffer[(col_size_recon * j) + (i * 4) + 0] = Red + bRed; | 復位像素紅色 |
buffer[(col_size_recon * j) + (i * 4) + 1] = Green + bGreen; | 復位像素藍色 |
buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + bBlue; | 復位像素綠色 |
buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + bAlpha; }} | 復位像素透明 |
處理filter濾波3 = Average
if(filter == 3) { | Average |
for( i = 0; i < png->width; ++i){ | 逐像素復位 |
Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
aRed = aGreen = aBlue = aAlpha = 0; | 清零 |
bRed = bGreen = bBlue = bAlpha = 0; | 清零 |
if(i > 0) { | |
aRed = buffer[(col_size_recon * j) + ((i-1) * 4) + 0]; | a像素紅色 |
aGreen = buffer[(col_size_recon * j) + ((i-1) * 4) + 1]; | a像素藍色 |
aBlue = buffer[(col_size_recon * j) + ((i-1) * 4) + 2]; | a像素綠色 |
aAlpha = buffer[(col_size_recon * j) + ((i-1) * 4) + 3]; } | a像素透明 |
if(j > 0) { | |
bRed = buffer[(col_size_recon * (j-1)) + (i * 4) + 0]; | b像素紅色 |
bGreen = buffer[(col_size_recon * (j-1)) + (i * 4) + 1]; | b像素藍色 |
bBlue = buffer[(col_size_recon * (j-1)) + (i * 4) + 2]; | b像素綠色 |
bAlpha = buffer[(col_size_recon * (j-1)) + (i * 4) + 3];} | b像素透明 |
buffer[(col_size_recon * j) + (i * 4) + 0] = Red + ((aRed+bRed)/2); | 復位像素紅色 |
buffer[(col_size_recon * j) + (i * 4) + 1] = Green + ((aGreen+bGreen)/2); | 復位像素藍色 |
buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + ((aBlue+bBlue)/2); | 復位像素綠色 |
buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + ((aAlpha+bAlpha)/2); }} | 復位像素透明 |
Paeth預測函式
BYTE PaethPredictor_PNG(BYTE a,BYTE b,BYTE c){ | 預測函式 |
int p; | |
int pa,pb,pc; | |
p = a + b – c; | |
pa = abs(p – a); | |
pb = abs(p – b); | |
pc = abs(p – c); | |
if (pa <= pb && pa <= pc ) return a; | |
else if (pb <= pc ) return b; | |
else return c;} |
處理filter濾波4 =Paeth預測
if(filter == 3) { | Average |
for( i = 0; i < png->width; ++i){ | 逐像素復位 |
Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
aRed = aGreen = aBlue = aAlpha = 0; | 清零 |
bRed = bGreen = bBlue = bAlpha = 0; | 清零 |
cRed = cGreen = cBlue = cAlpha = 0; | 清零 |
if(i > 0) { | |
aRed = buffer[(col_size_recon * j) + ((i-1) * 4) + 0]; | a像素紅色 |
aGreen = buffer[(col_size_recon * j) + ((i-1) * 4) + 1]; | a像素藍色 |
aBlue = buffer[(col_size_recon * j) + ((i-1) * 4) + 2]; | a像素綠色 |
aAlpha = buffer[(col_size_recon * j) + ((i-1) * 4) + 3]; } | a像素透明 |
if(j > 0) { | |
bRed = buffer[(col_size_recon * (j-1)) + (i * 4) + 0]; | b像素紅色 |
bGreen = buffer[(col_size_recon * (j-1)) + (i * 4) + 1]; | b像素藍色 |
bBlue = buffer[(col_size_recon * (j-1)) + (i * 4) + 2]; | b像素綠色 |
bAlpha = buffer[(col_size_recon * (j-1)) + (i * 4) + 3];} | b像素透明 |
if(i > 0 && j > 0) { | |
cRed = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 0]; | c像素紅色 |
cGreen = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 1]; | c像素藍色 |
cBlue = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 2]; | c像素綠色 |
cAlpha = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 3];} | c像素透明 |
buffer[(col_size_recon * j) + (i * 4) + 0] = Red + PaethPredictor_PNG(aRed,bRed,cRed); | 復位像素紅色 |
buffer[(col_size_recon * j) + (i * 4) + 1] = Green + PaethPredictor_PNG(aGreen,bGreen,cGreen); | 復位像素藍色 |
buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + PaethPredictor_PNG(aBlue,bBlue,cBlue); | 復位像素綠色 |
buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + PaethPredictor_PNG(aAlpha,bAlpha,cAlpha);}} | 復位像素透明 |
释放圖像
free(png->buffer); | 释放 |
png->buffer = buffer; | 替换復位圖像 |
png->bitCount = 32; | rgba |
png->buffer_size = buffer_size; |
『Adobe』同『Google』合作,制作『日月韓漢』矢量字庫,目前支缓65535『日月韓漢』字.以字量蒞睇依然有大量異體字未收納.
1. 官網下載『源界明朝』字庫,
2. 解壓
3. 將『SuperOTC\SourceHanSerif.ttc』复制到『C:\Windows\Fonts』
https://github.com/adobe-fonts/source-han-serif/archive/1.001R.zip |
https://typekit.com/fonts/source-han-sans-traditional-chinese |
换『臺達FLEX-500W火牛』後,『X99i』唔識認『TOSHIBA XG3 1TB』同『Seagate XM1440 960Gb』仲試過藍屏死機.
睇蒞都係要買翻『益衡FLEX-600W』, 貴係貴D, 勝在稳定唔死機.
『ZLIB』開源『壓縮』同『解壓』程式庫, 支持『DEFLATE』冇損壓縮算法,佢混合『LZ77算法』同『霍夫曼編碼』.
『DEFLATE』壓縮算法冇專利權.畀人大量應用係『網络』『圖檔』『文檔』『影片』.
.PNG/ Libpng | 圖檔解壓 |
.ZIP | 壓縮檔 |
.tar | 壓縮檔 |
.gz | 壓縮檔 |
HTTP | 壓縮傅送 |
FFmpeg | 影片解壓 |
下载『ZLIB』
http://www.zlib.net/ |
http://www.zlib.net/zlib-1.2.13.tar.gz |
『Android studio』內置『ZLIB』, 唔使下載.但要係『CMakeLists.txt』增添『zlib』庫.
CMakeLists.txt文檔 | |
find_library( z-lib z ) | 搜索zlib |
target_link_libraries( ${z-lib} ) | 連接zlib |
包含『ZLIB』頭文檔
#include <zlib.h> | Zlib-api |
#include <zconf.h> |
『z_stream』壓縮同解壓皆需此結构體
z_stream stream; | zlib流結构體 |
stream.zalloc = Z_NULL; | NULL用默認記憶體分配函数 |
stream.zfree = Z_NULL; | NULL用默認記憶體释放函数 |
stream.opaque = Z_NULL; | |
stream.next_in = (Bytef*)sour; | 蒞源 |
stream.avail_in = (uInt)sour_length; | 蒞源長 |
stream.next_out = dest; | 輸出 |
stream.avail_out = (uInt)*dest_length; | 輸出長 |
『ZLIB』壓縮分叁步
壓縮 | |
deflateInit(&stream, level) | 分配記憶體,level壓縮等級 |
deflate(&stream, flush); | 壓縮數據, flush設0 |
deflateEnd(&stream); | 释放記憶體 |
int deflateInit2( | deflateInit()加强版 |
z_streamp strm, | zlib流結构體 |
int level, | level壓縮等級0~9.
0:速度快,唔壓縮. 9:速度慢,壓縮率高. |
int method, | 壓縮算法僅支緩Z_DEFLATED |
int windowBits, | 處理RAW DEFLATE手法. |
int memLevel, | 指定記憶體分配MAX_MEM_LEVEL |
int strategy)); | 壓縮策略,僅影響壓縮比.默認Z_DEFAULT_STRATEGY |
level | 壓縮等級 |
#define Z_NO_COMPRESSION 0 | 唔壓縮 |
#define Z_BEST_SPEED 1 | 高速,低壓縮率 |
#define Z_BEST_COMPRESSION 9 | 高壓縮率, 慢速 |
#define Z_DEFAULT_COMPRESSION (-1) | 默認壓縮 |
windowBits | 處理RAW DEFLATE手法. |
8~15: | 純deflate壓縮 |
-8~-15: | zlib頭 + deflate + zlib尾 |
> 16: | Gzip頭+ deflate + Gzip尾 |
method | 壓縮算法 |
#define Z_DEFLATED 8 | DEFLATE冇損壓縮 |
memLevel | 記憶體分配 |
MemLevel=1 | 最小記憶體,速度慢壓縮比低 |
MemLevel=9
#define MAX_MEM_LEVEL 9 |
最大記憶體,最佳速度 |
MemLevel=8 | 默認值 |
strategy | 壓縮算法設定 |
#define Z_FILTERED 1 | 僅FILTERED生成數據 |
#define Z_HUFFMAN_ONLY 2 | 僅霍夫曼編碼 |
#define Z_RLE 3 | 匹配長度=1 |
#define Z_FIXED 4 | 禁霍夫曼編碼 |
#define Z_DEFAULT_STRATEGY 0 | 默認壓縮設定 |
『ZLIB』解壓分叁步
解壓 | |
inflateInit(&stream) | 分配記憶體 |
inflate(&stream, Z_NO_FLUSH); | 解压數據 |
inflateEnd(stream); | 释放記憶體 |
返回碼 | |
#define Z_OK 0 | |
#define Z_STREAM_END 1 | 結束 |
#define Z_NEED_DICT 2 | 愛密碼 |
#define Z_ERRNO (-1) | |
#define Z_STREAM_ERROR (-2) | |
#define Z_DATA_ERROR (-3) | 加密數據損壞壞,或缺失. |
#define Z_MEM_ERROR (-4) | 唔够記憶體 |
#define Z_BUF_ERROR (-5) | 唔够緩存 |
#define Z_VERSION_ERROR (-6) |
解壓示例
int Uncompress(PBYTE dest,int * dest_length,PBYTE sour,int sour_length)
{
z_stream stream;
int ret;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
stream.opaque = (voidpf)0;
stream.next_in = (Bytef*)sour;
stream.avail_in = (uInt)sour_length;
stream.next_out = dest;
stream.avail_out = (uInt)*dest_length;
MAX_MEM_LEVEL
ret = inflateInit2(&stream, 16+MAX_WBITS);
if (ret != Z_OK)
return ret;
ret = inflate(&stream, Z_NO_FLUSH);// 解压
*dest_length = stream.total_out;
inflateEnd(&stream);
return ret;
}
壓缩示例
bool Compress(PBYTE dest,int * dest_length,PBYTE sour,int sour_length, int level)
{
int ret, flush;
int sour_offset,dest_offset;
int have;
z_stream stream;
BYTE in[ZIP_CHUNK];
BYTE out[ZIP_CHUNK];
stream.zalloc = Z_NULL;// 内存分配函数
stream.zfree = Z_NULL;// 内存释放函数
stream.opaque = Z_NULL;
stream.next_in = (Bytef*)sour;
stream.avail_in = (uInt)sour_length;
stream.next_out = dest;
stream.avail_out = (uInt)*dest_length;
ret = deflateInit(&stream, level);// 内存分配
if (ret != Z_OK)
return false;
ret = deflate(&stream, flush); // 进行压缩
*dest_length = stream.total_out;
deflateEnd(&stream);// 释放内存
return ret;
}
『Gigabyte-X570 AORUS MASTER』成日間歇藍屏重啟.耳聞『EVGA 1000 G2』火牛質量嘛嘛,唯有試换火牛,睇中古台達『火牛GM1300』.冚模块設計.
買翻蒞壹直冇装機.
『CRC32』同『MD5』『SHA1』壹樣,計『貳进制』數值『指紋』,佢速度快,HASH校验值肆字節.两DWORD值相等比較. 适宜網络數據傳輸, 校驗數據係咪完璧.
DWORD CRC32_Table[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};
DWORD CRC32(PBYTE buf, int len){
int i;
DWORD crc;
crc = 0xffffffffL;
for (i = 0; i < len; ++i )
crc = CRC32_Table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);
crc = crc ^ 0xffffffffL;
return crc;
}
你必須登入才能發表留言。