#include #include #include #include using namespace std; class BitsEmpaquetados { typedef unsigned char Octeto; Octeto * octetos; int cantidadOctetos; int cantidadBitsValidosUltimoOcteto; public: BitsEmpaquetados() : octetos{nullptr} { } void empaquetar(string cadenaBits) { cantidadOctetos = cadenaBits.size() / 8; if (cadenaBits.size() % 8 != 0) { cantidadOctetos++; cantidadBitsValidosUltimoOcteto = cadenaBits.size() % 8; } else cantidadBitsValidosUltimoOcteto = 8; if (octetos != nullptr) delete [] octetos; octetos = new Octeto[cantidadOctetos]; Octeto octeto = 0; int contadorBits = 0; int contadorOctetos = 0; for (char bit : cadenaBits) { octeto <<= 1; if (bit == '1') octeto |= 1; contadorBits++; if (contadorBits == 8) { octetos[contadorOctetos++] = octeto; contadorBits = 0; octeto = 0; } } if (contadorBits > 0) // contadorBits == cantidadBitsValidosUltimoOcteto octetos[contadorOctetos] = octeto; } string desempaquetar() { if (octetos == nullptr) throw string ("Para desempaquetar primero hay que empaquetar."); string cadenaBits = ""; for (int i = cantidadOctetos - 1, cantidadBits = cantidadBitsValidosUltimoOcteto; i >= 0; i--, cantidadBits = 8) { Octeto octeto = octetos[i]; for (int j = 0; j < cantidadBits; j++) { cadenaBits += to_string(octeto & 1); octeto >>= 1; } } reverse(cadenaBits.begin(), cadenaBits.end()); return cadenaBits; } void escribir(ostream & flujoSalida) const { if (octetos == nullptr) throw string ("Para escribir primero hay que empaquetar."); for (int i = 0; i < cantidadOctetos; i++) flujoSalida << octetos[i]; } }; int main () { vector pruebas = { "01101010", // "j" en ASCII "0110101001101010", // "jj" en ASCII "01100010011010010111010001110011", // "bits" en ASCII "10110", "010", "01101010010", "0110001001101001011101000111001110110" }; BitsEmpaquetados bits; for (const string & prueba : pruebas) { bits.empaquetar(prueba); string resultado = bits.desempaquetar(); if (prueba != resultado) cout << "ESTO VA MAL." << endl; else { cout << prueba << "=="; bits.escribir(cout); cout << "==" << resultado << endl; } } }