Je ne suis pas très bon en c du tout. J'ai essayé de capturer l'essence de ce que le code C fait en C# en utilisant cet article wikipedia. Cependant, ma version est totalement différente et n'obtient pas la même compression que le code C. Par conséquent, je voudrais porter le code suivant de C à C#. Cependant, je n'en ai pas besoin pour lire/écrire dans des fichiers.Besoin d'aide pour porter ce code C à C#
Je ne suis pas familier avec la façon dont la lecture et l'écriture de fichiers fonctionne en C. Par conséquent, tout le fluff lié au fichier me confond. Aussi ces lignes sont un peu confus: token = i - 1 | 0x80;
et length = (token & ~0x80) + 1;
/******************************************************************************
* LoadRLE/SaveRLE - Load and save binary data using RLE compression.
* Run-length tokens have a set MSB, while data tokens have a cleared
* MSB. The value of the token's remaining bits plus one indicates the
* length of the block. The minimum run length is three bytes, while
* the maximum is 128.
*
* data - Array holding data to load or save.
* size - Size of the data array.
* file - The file pointer to use.
* return - Total number of bytes read from or written to data[].
*/
size_t SaveRLE (unsigned char data[], size_t size, FILE *file)
{
unsigned char token;
unsigned int i;
size_t total = 0;
while(size)
{
/*This loop identifies blocks of repeating data:*/
i = 2;
while(i < size && i < 128 &&
data[i] == data[i - 1] && data[i - 1] == data[i - 2])
i++;
/*If repeating data was found, save it:*/
if(i > 2){
token = i - 1 | 0x80;
if(!fwrite(&token, 1, 1, file))
return total;
if(!fwrite(data, 1, 1, file))
return total;
data += i, size -= i, total += i;
}
/*This loop identifies blocks of non-repeating data:*/
i = 0;
while(i < size && i < 128 && (i + 2 > size ? 1 :
data[i] != data[i + 1] || data[i + 1] != data[i + 2]))
i++;
/*If non-repeating data was found, save it:*/
if(i){
token = i - 1;
if(!fwrite(&token, 1, 1, file))
return total;
if(fwrite(data, 1, i, file) != i)
return total;
data += i, size -= i, total += i;
}
}
return total;
}
size_t LoadRLE (unsigned char data[], size_t size, FILE *file)
{
unsigned char token;
unsigned int length;
size_t total = 0;
while(size && fread(&token, 1, 1, file)){
length = (token & ~0x80) + 1;
if (length > size)
return total;
if(token & 0x80){
if(!fread(&token, 1, 1, file))
return total;
memset(data, token, length);
}else{
if(fread(data, 1, length, file) != length)
return total;
}
data += length, size -= length, total += length;
}
return total;
}
Toute aide est grandement appréciée.
Mike, vous devrez faire un plus grand effort. SO ne va pas écrire des morceaux de code pour vous. Apprenez C, apprenez C# puis * faites-le *. –
Veuillez lire à nouveau mon message. Je demande simplement de l'aide pour des parties spécifiques. Si vous n'avez pas le temps de lire le message, veuillez ne pas laisser de commentaire disant apprendre le C et le C#. Ce n'est pas très utile du tout. – Mike
Pourquoi les gens reviennent-ils sur le commentaire d'Eli? Il n'a clairement pas lu le titre de la question. –