I have a char* name
which is a string representation of the short I want, such as "15" and need to output this as unsigned short unitId
to a binary file. T开发者_如何学JAVAhis cast must also be cross-platform compatible.
Is this the correct cast: unitId = unsigned short(temp);
Please note that I am at an beginner level in understanding binary.
I assume that your char* name
contains a string representation of the short that you want, i.e. "15"
.
Do not cast a char*
directly to a non-pointer type. Casts in C don't actually change the data at all (with a few exceptions)--they just inform the compiler that you want to treat one type into another type. If you cast a char*
to an unsigned short
, you'll be taking the value of the pointer (which has nothing to do with the contents), chopping off everything that doesn't fit into a short
, and then throwing away the rest. This is absolutely not what you want.
Instead use the std::strtoul
function, which parses a string and gives you back the equivalent number:
unsigned short number = (unsigned short) strtoul(name, NULL, 0);
(You still need to use a cast, because strtoul
returns an unsigned long
. This cast is between two different integer types, however, and so is valid. The worst that can happen is that the number inside name
is too big to fit into a short
--a situation that you can check for elsewhere.)
#include <boost/lexical_cast.hpp>
unitId = boost::lexical_cast<unsigned short>(temp);
To convert a string to binary in C++ you can use 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.
}
}
that cast will give you (a truncated) integer version of the pointer, assuming temp is also a char*. This is almost certainly not what you want (and the syntax is wrong too). Take a look at the function atoi, it may be what you need, e.g. unitId = (unsigned short)(atoi(temp)); Note that this assumes that (a) temp is pointing to a string of digits and (b) the digits represent a number that can fit into an unsigned short
Is the pointer name
the id, or the string of chars pointed to by name
? That is if name
contains "1234"
, do you need to output 1234
to the file? I will assume this is the case, since the other case, which you would do with unitId = unsigned short(name)
, is certainly wrong.
What you want then is the strtoul()
function.
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. */
}
Be careful about writing binary values to a file; the result of doing the obvious thing may work now but will likely not be portable.
If you have a string (char* in C) representation of a number you must use the appropriate function to convert that string to the numeric value it represents.
There are several functions for doing this. They are documented here: http://www.cplusplus.com/reference/clibrary/cstdlib
精彩评论