Хорошо, вот ваше решение (хотя оно не очень тщательно проверено):
template<typename TItem, typename TItem2>
void SetEnableFlags(TItem &BitFlags, const TItem2 &Flags)
{
BitFlags = (BitFlags|Flags);
}
const unsigned char CharArrayToByte(const char Data[])
{
if(Data == NULL){return 0;}
if(strlen(Data) < 8){return 0;}
unsigned char Byte = 0;
SetEnableFlags(Byte,(Data[0]-'0')*128);
SetEnableFlags(Byte,(Data[1]-'0')*64);
SetEnableFlags(Byte,(Data[2]-'0')*32);
SetEnableFlags(Byte,(Data[3]-'0')*16);
SetEnableFlags(Byte,(Data[4]-'0')*8);
SetEnableFlags(Byte,(Data[5]-'0')*4);
SetEnableFlags(Byte,(Data[6]-'0')*2);
SetEnableFlags(Byte,(Data[7]-'0')*1);
return Byte;
}
const bool ConvertToBytes(char Bytes[], const char Binary[])
{
if( (Binary == NULL) || (Bytes == NULL) ){return false;}
//Checks it's a power of 8
int Size = strlen(Binary);
if(Size < 8){return false;}
float SizeTest = ((float)Size/8.0);
if( (SizeTest - (int)SizeTest ) != 0.0 ){return false;}
unsigned int Power = 0;
unsigned int Iter = 0;
do
{
Power = 8*Iter;
Bytes[Iter] = CharArrayToByte( (Binary+Power) );
Iter++;
}while(Power < Size);
return true;
}
int main()
{
char Bytes[3]; //Allocate enough space for it
char Binary[] = "000000010000001100001111"; //1, 3, 15
if(!ConvertToBytes(Bytes,Binary)){return 1;}
printf("%d %d %d!\n",Bytes[0],Bytes[1],Bytes[2]);
return 0;
}
Вы можете также прочитать эту ветку здесь , чтобы упростить свою работу.
Код не оптимизирован. Вы можете использовать его для любых целей, даже коммерческих (если вы можете продать его). Строки станут нечитаемыми за пределы 8 бит, поэтому вы можете просто вызвать CharArrayToByte вручную (убедитесь, что длина массива char действительно равна 8 символам, иначе у вас возникнут проблемы). Если вы хотите преобразовать его обратно, вам нужно обратить процесс вспять.
Неясно, используете ли вы C или C ++ (с кодированием C), поэтому вам, вероятно, придется изменить его в соответствии с вашими потребностями.