void Tree::buildHeader(string filename){ string aux_s; string aux_s2; BitArray *bit = new BitArray(); int aux_bit; int k; aux_s.clear(); writeTree(root, aux_s); aux_s.clear(); tree_written = tree_written.substr(1,tree_written.length()-2); sizeTree = tree_written.length(); equilibrar(tree_written); switch (sizeTrash) { case 1: aux_s = "001"; break; case 2: aux_s = "010"; break; case 3: aux_s = "011"; break; case 4: aux_s = "100"; break; case 5: aux_s = "101"; break; case 6: aux_s = "110"; break; case 7: aux_s = "111"; break; case 8: aux_s = "000"; default: break; } aux_bit = sizeTree/2; if(sizeTree%2 == 1){ aux_s2 = "1"; } else if(sizeTree%2 == 0){ aux_s2 = "0"; } aux_bit = sizeTree; while(aux_bit > 1){ aux_bit = aux_bit/2; if(aux_bit % 2 == 1){ aux_s2 += "1"; } else if(aux_bit % 2 == 0){ aux_s2 += "0"; } } aux_bit = 13 - aux_s2.length(); reverse(aux_s2.begin(), aux_s2.end()); for(int i=0; i < aux_bit; i++){ aux_s += "0"; } aux_s += aux_s2; codenode_to_bitarray(aux_s.substr(0,8), bit); codenode_to_bitarray(aux_s.substr(8,8), bit); aux_s.clear(); k = 3 + filename.length() + sizeTree; header = new unsigned char[k]; header = bit->getArray(); unsigned char c = filename.length(); header[2] = c; int w =0; for(int i =0; i<filename.length();i++){ w = i +3; header[w] = filename[i]; } w = 0; int j = 3 + filename.length(); for(int i = 0;i< sizeTree;i++){ w = i+j; header[w] = tree_written[i]; } sizeHeader = k; sizeFileName = filename.length(); for(int i=0;i<k;i++); }
void Tree::writefile(char *pathIn){ ifstream file; ofstream write; string aux; string aux2; string temporaria; int sobra = 0; int sizefile = 0; BitArray *buffer = new BitArray(); aux.clear(); temporaria.clear(); codificar(root, aux); aux.clear(); file.open(pathIn , ios::in | ios::binary | ios::ate); if(file.is_open()){ int size = file.tellg(); file.seekg(0, ios::beg); int i; int iw =1; for(i=0; i< size; i++){ unsigned char c = file.get(); int j = c; aux += codeNodes[j]; if(aux.length() >= 1024*8){ sobra = aux.length() - 1024*8; temporaria = aux.substr(1024*8, sobra); for(int k = 0;k < (aux.length()/8); k++){ int n = k*8; aux2 = aux.substr(n, 8); codenode_to_bitarray(aux2, buffer); } iw++; write.open("temp.huff", ios::out | ios::binary | ios::app); if(write.is_open()){ for(int z = 0;z < aux.length()/8;z++){ write << buffer->getArray()[z]; sizefile++; } } write.close(); aux.clear(); aux = temporaria; buffer->clear(); } } int y = (aux.length()/8); sobra = aux.length() - (y*8); aux2 = aux.substr(y*8,sobra); string teste = aux2; for(int k = 0;k < (aux.length()/8); k++){ int n = k*8; aux2 = aux.substr(n, 8); codenode_to_bitarray(aux2, buffer); } int u = 8 - sobra; sizeTrash = u; aux2 = teste; for(int i = 0;i < u;i++){ aux2 += '0'; } codenode_to_bitarray(aux2, buffer); sizeLast = (buffer->getCurrent() / 8); sizeLast--; write.open("temp.huff", ios::out | ios::binary | ios::app); if(write.is_open()){ for(int z=0; z <= sizeLast;z++){ write << buffer->getArray()[z]; sizefile++; } } write.close(); sizeTrash = buffer->trashLenght(); buffer->clear(); } else cout << "TRASH!in WriteFile" << endl; file.close(); }
//Constrói o cabeçalho void Tree::buildHeader(std::string filename) { std::string aux_s; std::string aux_s2; bitArrays *bit = new bitArrays(); int aux_bit; int k; aux_s.clear(); writeTree(root, aux_s); aux_s.clear(); //cout << tree_written << endl; tree_written = tree_written.substr(1,tree_written.length()-2); sizeTree = tree_written.length(); equilibrar(tree_written); switch (sizeTrash) { case 1: aux_s = "001"; break; case 2: aux_s = "010"; break; case 3: aux_s = "011"; break; case 4: aux_s = "100"; break; case 5: aux_s = "101"; break; case 6: aux_s = "110"; break; case 7: aux_s = "111"; break; case 8: aux_s = "000"; default: break; } aux_bit = sizeTree/2; if(sizeTree%2 == 1) { aux_s2 = "1"; } else if(sizeTree%2 == 0) { aux_s2 = "0"; } /* for(int i=0; i < 13; i++) { if(aux_bit == 1) { aux_s2 += "1"; break; } if((aux_bit % 2) == 1) { aux_s2 += "1"; } else if((aux_bit % 2) == 0) { aux_s2 += "0"; } aux_bit = aux_bit / 2; } */ aux_bit = sizeTree; while(aux_bit > 1) { aux_bit = aux_bit/2; if(aux_bit % 2 == 1) { aux_s2 += "1"; } else if(aux_bit % 2 == 0) { aux_s2 += "0"; } } //cout << "string: " << aux_s2 << endl; aux_bit = 13 - aux_s2.length(); reverse(aux_s2.begin(), aux_s2.end()); //cout << "string2: " << aux_s2 << endl; for(int i=0; i < aux_bit; i++) { aux_s += "0"; } aux_s += aux_s2; //cout << "aux_s: " <<aux_s << endl; //std::string teste = aux_s.substr(0,8); //cout << teste << endl; codenode_to_bitarray(aux_s.substr(0,8), bit); //cout << "1: " << bit->getArray() << endl; codenode_to_bitarray(aux_s.substr(8,8), bit); aux_s.clear(); k = 3 + filename.length() + sizeTree; header = new unsigned char[k]; header = bit->getArray(); //cout << "header: " << header << endl; unsigned char c = filename.length(); header[2] = c; int w =0; for(int i =0; i<filename.length();i++) { w = i +3; header[w] = filename[i]; // cout << header[w] << " "; } //cout << endl; w = 0; int j = 3 + filename.length(); for(int i = 0;i< sizeTree;i++) { w = i+j; header[w] = tree_written[i]; } sizeHeader = k; sizeFileName = filename.length(); for(int i=0;i<k;i++) { //cout << "header: " << i << ":" << header[i] << endl; } }