Autor
|
Tema: Pasar de char* a string pérdida de datos (Leído 4,697 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Si char* tiene un caracter nulo en mitad de la secuencia al construir la string se corta allí: char *e = "aisjiajisfj\0buenas"; cout << string(e);
Y pierdo el poder convertir el char* en string, ¿no hay alguna solución para poderlo hacer?. Saludos. Bueno, quizás si nos aseguramos de lo que vamos a leer no contiene caracteres nulos hasta el final.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
Lo que delimita el tamaño de una cadena de caracteres es precisamente el carácter nulo. Si no hubiera un carácter nulo, entonces no sabríamos cual es el tamaño de la cadena. Entonces, cuando un objeto de tipo std::string toma los datos, lo hace hasta que encuentra un carácter nulo (repito, no hay otra forma segura de hacerlo). Lo único que puedes hacer es saber a ciencia cierta el tamaño de la cadena (el tamaño podría estar almacenado en una variable, por ejemplo). Una vez sabido esto, podrías reemplazar todos los caracteres nulos por otro carácter a tu elección: std::string cString; char *lpbyData = "aisjiajisfj\0buenas"; size_t nNumCharacters = 19; // No contamos el carácter nulo del final for(size_t i = 0; i < nNumCharacters; i++ { if(lpbyData[i] == '\0') lpbyData[i] = '~'; // Pon el carácter de tu elección } cString = lpbyData;
|
|
« Última modificación: 6 Noviembre 2015, 19:50 pm por class_OpenGL »
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Una vez sabido esto, podrías reemplazar todos los caracteres nulos por otro carácter a tu elección
Es lo que pensé pero podría fallar, ya que lo que hago es cifrar un archivo donde escribo bytes (u_char*), para llamar a write de ofstream debo usar un char* entonces hago la conversión, pero si algún byte vale nulo, valdrá \0 en la conversión y me cortará la cadena, podría sustiruirlo por otro carácter, aunque al final creo que lo mejor es usar fwrite. Y aprovecho para preguntar si alguien conoce alguna clase de C++ para escribir bytes, ya que ofstream.write() en teoria es solo para char*. Y se corta en el primer carácter nulo. Un saludo.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
Entonces, lo único que se me ocurre es que almacenes la cadena en un vector de chars: std::vector<char> cData; const char *lpbyData = "aisjiajisfj\0buenas"; size_t uNumCharacters = 19; cData.reserve(uNumCharacters); for(int i = 0; i < uNumCharacters; i++) { cData[i] = lpbyData[i]; }
|
|
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
string no se basa siempre en los caracteres nulos para iniicalizarse mediante un puntero a char. string tiene un constructor que recibe como primer parámetro el puntero a char, y como segundo parámetro la longitud de la cadena. Es uno de los constructores posibles cuando se trabaja con cadenas de datos binarios.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Si pero luego al llamar a c_str() se cortará en el primer \0 ¿no?, luego no habría valido para nada. struct datos{u_char *contenido; int tamaño;};//vector<u_char> void almacen::escribir(datos _datos) { ofstream archivo; archivo.open(directorio, ofstream::app | ofstream::binary); _datos = encriptador.encriptar_AES(_datos); archivo.write(reinterpret_cast<char*>(_datos.contenido), _datos.tamaño); //archivo.write(string((char*)_datos.contenido, _datos.tamaño).c_str(), _datos.tamaño); archivo.close(); }
Ahí dejo el code problemático. Saludos. Edito: lo que dice ivancea es verdad gracias por la informacion del constructor, pero al pasar a c_str() se corta en la primera \0 como es de esperar, luego para escribir bytes con ofstream.write() no podemos hacerlo, puesto que necesitamos char* y si hay algun byte nulo se nos cortara la cadena. Seguramente pase a fwrite. Saludos.
|
|
« Última modificación: 8 Noviembre 2015, 00:32 am por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
c_str() retorna la cadena completa. Y size() retorna el tamaño de la cadena. Así pues, no, no corta nada. Pero eso sí, si trabajar con cadenas binarias, trabajas siempre con métodos para ese tipo de cadenas. ni ostream::operator<<, ni strlen, ni otras funciones o métodos que se valgan de '\0' directa o indirectamente para determinar la longitud de la cadena. Lo único que hace c_str(), al igual que data() a partir de C++11, es agregar un caracter nulo al final, siendo el tamaño real de la cadena devuelta de size()+1. Pero si trabajas con datos binarios, ese caracter nulo final es suplerfluo.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Buenas socio, me recomiendas usar fwrite y fread para trabajar con bytes en C++, ¿o conoces algo mejor?. Por lo que has dicho, ¿esto no se cortaría?: string cadena = reinterpret_cast<char*>(_datos.contenido); archivo.write(cadena.c_str(), cadena.size());
?? Saludos.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Buenas socio, me recomiendas usar fwrite y fread para trabajar con bytes en C++, ¿o conoces algo mejor?. Por lo que has dicho, ¿esto no se cortaría?: string cadena = reinterpret_cast<char*>(_datos.contenido); archivo.write(cadena.c_str(), cadena.size());
?? Saludos. Estás construyendo mal la string. Estás construyendola pasándole solo un char*. string tiene un constructor que recibe como primer parámetro el puntero a char, y como segundo parámetro la longitud de la cadena. Es uno de los constructores posibles cuando se trabaja con cadenas de datos binarios.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Ah si perdon, se me escapó, pero si la construyo con 2 argumentos (char*, tamaño) pasa lo mismo, pues el c_str() corta al primer \0, aunque le digamos escribe 50 char, cuando el write encuentra el primer \0 deja de escribir ¿no?.
Saludos.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Char[] != String
« 1 2 »
Programación General
|
Hendrix
|
19
|
10,958
|
22 Agosto 2011, 03:54 am
por someRandomCode
|
|
|
Como pasar una cadena char a hexadecimal por argumento a un constant char?
Programación C/C++
|
ahaugas
|
3
|
5,813
|
13 Enero 2013, 14:09 pm
por ahaugas
|
|
|
Pasar tipo const char* a char
« 1 2 »
Programación C/C++
|
jorge_hura
|
15
|
11,582
|
25 Julio 2013, 09:50 am
por Eternal Idol
|
|
|
Problema con string, char, etc
Programación C/C++
|
GenR_18
|
2
|
2,008
|
21 Septiembre 2013, 19:30 pm
por GenR_18
|
|
|
Pasar cadena String a una variable Char en C++
Programación C/C++
|
RGT
|
3
|
2,783
|
6 Noviembre 2015, 16:19 pm
por class_OpenGL
|
|