Voila j' ai obtenue la routine de décompression de fichier BMP mais on me la fourni en visual C++
Si certaine personnes peuvent m' aider a la traduire en visual basic merci
code:--------------------------------------------------------------------------------
BOOL CWECompress::_DeCompress(BYTE **BufDest, BYTE *BufSrc)
{
BYTE *ptrRes = *BufDest;
LONG k3;
ULONG i,j;
BYTE k,k2;
i = 0;
while (TRUE)
{
if ((i & 0x100) == 0) // (i < 0x100) or (0x1000 <i < 0x10FF) ...
{
k = *BufSrc & 0xFF; // Get data and do data % FF
BufSrc++; // add pointer
i = k | 0xFF00; // i = 0xFF unito a k
}
k2 = *BufSrc & 0xFF; // get data
if (((BYTE) i & 1) == 0) // t = 0 se i pari, t = 1 se i dispari
// Literal
{
*ptrRes = (BYTE) k2; // res = k2
ptrRes++;// add pointer
BufSrc++;
}
else
{
if ((k2 & 0x80) != 0) // k2 & 0x80 != 0 Solo se k2 > 0x80 il controllo passa
// Caso in cui abbiamo 1 solo byte per il comando,
// nbit move = 4, nbitrepeat = 4
{
BufSrc++;// add pointer
if ((k2 & 0x40) != 0) // k2 & 0x40 != 0 Solo se k2 > 0xC0 il controllo passa
{
// blocco per copiare i bytes in plain mode
// nrepeatmax = 0xFE-0xB9 = 69 7 bit
// nrepeatmin = 0xC0-0xB9 = 7
k = k2 & 0xFF;// k = k2 & 0xFF
k3 = k - 0xB9;// k3 = k - 0xB9 k3 = numero ottenuto sottraendo k2 fatto passare
if (k == 0xFF)
break; // esci dal ciclo
// ciclo che copia i k3 bytes in plain mode
while(k3-- >= 0) //sicuramente k3 > 0
{
k2 = *BufSrc & 0xFF;// get data
BufSrc++;// add pointer
ptrRes++;// add pointer
*(ptrRes - 1) = (BYTE) k2; // write k2 on ptrRes
}
i = i >> 1;// i SHR 1
continue;
}
// questo j mi dirà quanto dovrò spostarmi indietro per ripetere k3+1 volte il
// ciclo (max 16)
// max j = 16, k3 = 4 con BF
j = (k2 & 0x0F) + 1;// k2 & 0x0F = prendo gli ultimi 4 bit e sommo 1
k3 = (k2 >> 4) - 7;// k2 >> 4 = tolgo gli ultimi 4 bit,e tolgo 7;
// k3 mi dice quante volte devo ripetere il byte + 1 volta del ciclo + 1 messa in precedenza
// es. 90 -> j = 1 [1 byte indietro], k3 = 90 >> 4 - 7 = 9 - 7 = 2
// -> 2 + 1 + 1 = 4 volte
}
else
{
// 2 bytes per il comando tipo 24 01
// nbit move = 14, nbitrepeat = 6
j = *(BufSrc + 1) & 0xFF;// get data (prendi il byte successivo)
BufSrc += 2;// add pointer by 2
k3 = (k2 >> 2) + 2;// k3 = togli ultimi 2 bit + 2 (24 = 11 volte infatti)
j = j | (k2 & 3) << 8;// j = j | (k2 & 3)*256
// max j = 1024, k3 = 33 con 7F FF
// numero di bytes da arretrare per poi scrivere k3 volte i bytes ritrovati
// es 24 01 -> j = 01 | (24 & 3) << 8 = 1 | 0 = 1, k3 = 24 >> 2 + 2 = 9 + 2 = 11
// -> 11 + 1 + 1 = 13 volte
}
// ciclo per ripetere k3 volte + 1 il byte a partire dalla posizione -j
for ( ; k3>=0; k3--) // loop until k3>=0
{
*ptrRes = *(ptrRes - j) & 0xFF;// write data from first (far j bytes) for k3 times
ptrRes++;
};
}
i = i >> 1;
}
return TRUE;
}
PS : Peut on déduire de cette routine la routine de compréssion merci.