2010-06-23 12 views
8

Tengo char* name que es una representación de cadena del corto que quiero, como "15" y necesito dar como unsigned short unitId a un archivo binario. Este elenco también debe ser compatible multiplataforma.Cómo convertir char * a corto sin signo en C++

es éste el elenco correcta: unitId = unsigned short(temp);

Tenga en cuenta que estoy en un nivel de principiante en la comprensión binario.

+0

¿Por qué desea almacenar el valor del puntero en un archivo en primer lugar? ¿Está tratando de usar el puntero a la cadena de caracteres como algún tipo de UID similar a una clave principal en una base de datos? Más detalles serían útiles. –

+0

Leo un archivo binario y lo analizo, luego convierto los datos y los saco a un nuevo formato binario. También estoy trabajando con código heredado. Realmente solo necesito aprender a convertir char * a corto sin firmar. – Elpezmuerto

Respuesta

14

Asumo que su char* name contiene una cadena representación de la corto que desee, es decir, "15".

Do no inserta un char* directamente en un tipo no puntero. Los moldes en C en realidad no modifican los datos (con algunas excepciones): simplemente le informan al compilador que desea tratar un tipo en otro tipo. Si lanza un char* a un unsigned short, tomará el valor del puntero (que no tiene nada que ver con el contenido), cortando todo lo que no encaja en un short y luego descartando el resto . Esto no es absolutamente lo que quieres.

En lugar de utilizar la función std::strtoul, que analiza una cadena y le devuelve el número equivalente:.

unsigned short number = (unsigned short) strtoul(name, NULL, 0); 

(usted todavía tiene que usar un yeso, porque strtoul devuelve un unsigned long Este reparto es entre dos diferentes tipos enteros, sin embargo, y también lo es válida. lo peor que puede pasar es que el número dentro name es demasiado grande para caber en un short --una situación que se puede comprobar en otros lugares.)

+0

bueno, tienes que comprobarlo antes de asignar a 'number', por ejemplo, asignando un primer largo sin signo y verificando con' USHRT_MAX'. –

2

que emitirá una versión entera (truncada) del puntero, suponiendo que la temperatura también es un char *. Esto es casi seguro que no es lo que quiere (y la sintaxis también es incorrecta). Eche un vistazo a la función atoi, puede ser lo que necesita, p. unitId = (unsigned short) (atoi (temp)); Tenga en cuenta que esto supone que (a) la temperatura es que apunta a una cadena de dígitos y (b) las cifras representan un número que puede caber en un unsigned short

9
#include <boost/lexical_cast.hpp> 

unitId = boost::lexical_cast<unsigned short>(temp); 
5

Para convertir una cadena a binaria en C++ puede usar stringstream.

#include <sstream> 

. . . 

int somefunction() 
{ 
    unsigned short num; 
    char *name = "123"; 
    std::stringstream ss(name); 

    ss >> num; 

    if (ss.fail() == false) 
    { 
     // You can write out the binary value of num. Since you mention 
     // cross platform in your question, be sure to enforce a byte order. 
    } 
} 
0

Es el puntero name el id, o la cadena de caracteres apuntada por name? Es decir, si name contiene "1234", ¿necesita generar 1234 en el archivo? Asumiré que este es el caso, ya que el otro caso, que harías con unitId = unsigned short(name), es ciertamente incorrecto.

Lo que quiere entonces es la función strtoul().

char * endp 
unitId = (unsigned short)strtoul(name, &endp, 0); 
if (endp == name) { 
    /* The conversion failed. The string pointed to by name does not look like a number. */ 
} 

Tenga cuidado al escribir valores binarios en un archivo; el resultado de hacer lo obvio puede funcionar ahora, pero probablemente no sea portátil.

0

Si tiene una representación de cadena (caracteres * en C) de un número, debe usar la función adecuada para convertir esa cadena en el valor numérico que representa.

Existen varias funciones para hacer esto. Están documentados aquí: http://www.cplusplus.com/reference/clibrary/cstdlib

Cuestiones relacionadas