Ответы пользователя по тегу Программирование
  • Почему записывается лишняя информация в палитровые изображение(bmp)?

    deadrime
    @deadrime Автор вопроса
    int size = BMFileHeader.Size - BMFileHeader.OffsetBits;
    	palette_img = new byte[size];
    
    	for (int i = 0;i<size;i++)
    	{
    		fread(&palette_img[i], 1, 1, f);
    	}


    int size = BMFileHeader.Size - BMFileHeader.OffsetBits;
    	for (int i = 0;i<size;i++)
    	{
    		fwrite(&palette_img[i], 1, 1, f);
    	}

    Вот это в общем сработало...
    Ответ написан
    Комментировать
  • Как организовать побитовую запись?

    deadrime
    @deadrime Автор вопроса
    В общем очень много где искал и в итоге нашел несколько способов, хотя как по мне все они не особо удобные.
    Надеюсь помогу кому-нибудь, а то сам довольно долго разбирался что да как.

    Самая простая - создать структуру байта и описать в ней каждый бит.
    Причем максимально верно, как я понял, так это сделать это через объединения, хотя я еще не совсем в этом разобрался.

    struct Bits
    {
        unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
    };
    union CBits
    {
        Bits bits;
        unsigned char byte;
    };


    В этом случае записать 1 байт можно например вот так -

    void write_bait(FILE* out, string code) { 
    	CBits byte;
    	byte.bits.b0=(code[0]=='1') ? 1:0;//тоже самое что и if(code[0]=='1') byte.bits.b0=1; else byte.bits.b0=0;
            .................
    	byte.bits.b7= (code[7]=='1') ? 1:0;
    	fwrite(&byte,sizeof(one_byte),1,out);
    }


    Второй способ - преобразовать массив boolean в unsigned char и "побитовым или" писать в нужный бит 1
    Если я правильно понял - c = c | (1 << 7); - это запись в 7-й разряд, т.е
    00000000
    00000010
    ____________
    00000010
    и с = 2^7 = 128

    а
    (c & (1<<7)) != 0) - это проверка на 1 в 7-м разряде
    т.е
    00000111
    00000010
    ___________
    00000010
    результат !=0, значит есть единица в 7-м разряде.

    void BoolToByte(FILE *file, bool b[8])
    {
        unsigned char c = 0;
        for (int i=0; i < 8; ++i)
            if (b[i])
    		{
                c = c | (1 << i);
    		}
        fwrite(&c,1,1,file);
        return;
    }

    и
    void BoolFromByte(FILE *file, bool b[8])
    {
    	unsigned char c;
    	fread(&c,1,1,file);
        for (int i=0; i < 8; ++i)
    		if ((c & (1<<i)) != 0) b[i] = true;
    }


    Мне же удобно было держать коды в string , поэтому я переделал под нее -

    void ToByte(FILE *file, string &b)
    {
        unsigned char c = 0;
        for (int i=0; i < 8; ++i) 
    		{
    			if (b[i]=='1') 
    			{
    				c = c | (1 << i);
    			}
    		}
        fwrite(&c,1,1,file);
        return;
    }

    и
    void FromByte(FILE *file , string &b)
    {
    	unsigned char c;
    	fread(&c,1,1,file);
        for (int i=0; i < 8; ++i)
    		if ((c & (1<<i)) != 0) b[i] = '1';	
    }


    Еще есть вариант, но я до него не дошел - это писать все непосредственно в буфер, а потом записывать весь буфер целиком, а не по байтам, как я.

    В общем как-то так, поправьте меня, если где ошибся или можно улучшить/сократить функцию..
    Ответ написан
    Комментировать