根据条件替换指令

时间:2012-08-20 18:22:01

标签: c++ optimization for-loop

我有两个for循环,我想在一个函数中写一个。问题是它只在一条指令中有所不同

for (int i = 1; i <= fin_cabecera - 1 ; i++ ){
    buffer[i] &= 0xfe;
    if (bitsLetraRestantes < 0) {
        bitsLetraRestantes = 7;
        mask = 0x80;
        letra = sms[++indiceLetra]; //*differs here*
    }
    char c = (letra & mask) >> bitsLetraRestantes--;
    mask >>= 1;
    buffer[i] ^= c; 
}

另一个

for (int i = datos_fichero; i <= tamanio_en_bits + datos_fichero; i++){
    buffer[i] &= 0xfe;
    if (bitsLetraRestantes < 0) {
        bitsLetraRestantes = 7;
        mask = 0x80;
        f.read(&letra, 1);  //*differs here*
    }
    char c = (letra & mask) >> bitsLetraRestantes--;
    mask >>= 1;
    buffer[i] ^= c; 
}

我想到这样的事情:

void write_bit_by_bit(unsigned char buffer[], int from, int to, bool type) {
    for (int i = to; i <= from; i++) {
        buffer[i] &= 0xfe;
        if (bitsLetraRestantes < 0) {
            bitsLetraRestantes = 7;
            mask = 0x80;
            type ? (letra = sms[++indiceLetra]) : f.read(&letra, 1);
        }
        char c = (letra & mask) >> bitsLetraRestantes--;
        mask >>= 1;
        buffer[i] ^= c;
    }
}

但我认为必须有更好的方法。

上下文:

我会提供更多背景信息(我会尝试在语言限制范围内尽可能地解释它)。我必须每次读取一个字节,因为Buffer变量表示图像像素。 sms是必须隐藏在图像中的消息,letra是该消息的单个字符。为了不修改图像的方面,每个字符的每个位必须写在每个像素的最后一位。让我举个例子。

letra = 'H' // 01001000 in binary

buffer[0] = 255 // white pixel 11111111

为了隐藏H char,我需要8个像素:

结果如下:

buffer[0] //11111110, 
buffer[1] //11111111 
buffer[2] //11111110 
buffer[3] //11111110 
buffer[4] //11111111 
buffer[5] //11111110 
buffer[6]//11111110 
buffer[7]//11111110

H隐藏在图像的最后一位。我希望我解释得很好。

[解决]

感谢@anatolyg我已经重新编写了代码,现在可以正常工作了。以下是它的外观:

void write_bit_by_bit(unsigned char buffer[], ifstream& f,int from, int to, char sms[], bool type){

unsigned short int indiceLetra        = 0;
short int bitsLetraRestantes          = 7;
unsigned char mask                    = 0x80; //Empezamos por el bit más significativo (10000000)

char* file_buffer;

if(type){ //Write file data
    int number_of_bytes_to_read = get_file_size(f);
    file_buffer = new char[number_of_bytes_to_read];
    f.read(file_buffer, number_of_bytes_to_read);
}

const char* place_to_get_stuff_from = type ? file_buffer : sms;
char letra = place_to_get_stuff_from[0];

for (int i = from; i <= to; i++) {
    buffer[i] &= 0xfe; //hacemos 0 último bit con máscara 11111110
    //TODO: Hacer con dos for
    if (bitsLetraRestantes < 0) {
        bitsLetraRestantes = 7;
        mask = 0x80;
        letra = place_to_get_stuff_from[++indiceLetra];//letra = sms[++indiceLetra];
    }
    char c = (letra & mask) >> bitsLetraRestantes--;
    mask >>= 1;
    buffer[i] ^= c; //Almacenamos en el ultimo bit del pixel el valor del caracter
}
}

int ocultar(unsigned char buffer[],int tamImage, char sms[], int tamSms){
ifstream f(sms);
if (f) {
    strcpy(sms,basename(sms));
    buffer[0] = 0xff;
    int fin_cabecera = strlen(sms)*8 + 1;
    buffer[fin_cabecera] = 0xff;

    write_bit_by_bit(buffer, f, 1, fin_cabecera -1, sms, WRITE_FILE_NAME);

    int tamanio_en_bits = get_file_size(f) * 8;

    int datos_fichero = fin_cabecera + 1;
    write_bit_by_bit(buffer, f, datos_fichero, tamanio_en_bits + datos_fichero, sms, WRITE_FILE_DATA);

    unsigned char fin_contenido = 0xff;

    short int bitsLetraRestantes          = 7;
    unsigned char mask            = 0x80; 

    for (int i = tamanio_en_bits + datos_fichero + 1;
            i < tamanio_en_bits + datos_fichero + 1 + 8; i++) {
        buffer[i] &= 0xfe;
        char c = (fin_contenido & mask) >> bitsLetraRestantes--;
        mask >>= 1;
        buffer[i] ^= c; 
    }

}
return 0;
}

1 个答案:

答案 0 :(得分:2)

由于您在此处讨论优化,请考虑在循环外执行read。这将是一个主要的优化(一次读取10个字节必须比读取1个字节10次更快)。这需要额外的缓冲区(文件?)f

if (!type)
{
    char f_buffer[ENOUGH_SPACE];
    number = calc_number_of_bytes_to_read();
    f.read(f_buffer, number);
}
for (...) {
    // your code
}

完成此操作后,您的原始问题很容易回答:

const char* place_to_get_stuff_from = type ? sms : f_buffer;
for (...) {
        ...
        letra = place_to_get_stuff_from[++indiceLetra];
        ...
}
相关问题