У меня есть a char* name
который является строковым представлением короткого, я хочу, такой как "15" и должен произвести это как unsigned short unitId
к двоичному файлу. Этот бросок должен также быть межплатформенный совместимый.
Это корректный бросок: unitId = unsigned short(temp);
Обратите внимание на то, что я на уровне новичка в понимании двоичного файла.
Я предполагаю, что ваше char* name
содержит string представление короткого числа, которое вы хотите, т.е. "15"
.
Не не приводите char*
непосредственно к типу, не являющемуся указателем. Приведение в Си фактически не изменяет данные (за некоторыми исключениями) - оно просто сообщает компилятору, что вы хотите преобразовать один тип в другой. Если вы приведете char*
к unsigned short
, вы возьмете значение указателя (которое не имеет ничего общего с содержимым), отрежете все, что не помещается в short
, а остальное выбросите. Это совершенно не то, что вам нужно.
Вместо этого используйте функцию std::strtoul
которая анализирует строку и возвращает вам эквивалентное число:
unsigned short number = (unsigned short) strtoul(name, NULL, 0);
(Вам все еще нужно использовать приведение, потому что strtoul
возвращает unsigned long
. Однако это приведение выполняется между двумя различными целочисленными типами, поэтому оно корректно. Худшее, что может случиться, это то, что число внутри name
слишком велико, чтобы поместиться в short
- ситуация, которую можно проверить в другом месте.)
Является ли указатель имя
идентификатором или строкой символов, на которую указывает имя
? То есть, если имя
содержит «1234»
, нужно ли вывести 1234
в файл? Я предполагаю, что это так, поскольку другой случай, который вы бы сделали с unitId = unsigned short (name)
, определенно неверен.
Тогда вам нужна функция 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. */
}
Будьте осторожны при записи двоичных значений в файл; результат выполнения очевидной вещи может работать сейчас, но, скорее всего, не будет переносимым.
что приведение даст вам (усеченную) целочисленную версию указателя, предполагая, что temp также является char*. Это почти наверняка не то, что вам нужно (и синтаксис тоже неправильный). Посмотрите на функцию atoi, возможно, это то, что вам нужно, например, unitId = (unsigned short)(atoi(temp)); Обратите внимание, что здесь предполагается, что (a) temp указывает на строку цифр и (b) цифры представляют собой число, которое может поместиться в unsigned short
Для преобразования строки в двоичный формат в C++ можно использовать 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.
}
}
#include <boost/lexical_cast.hpp>
unitId = boost::lexical_cast<unsigned short>(temp);
Если у вас есть строковое (char * в C) представление числа, вы должны использовать соответствующую функцию для преобразования этой строки в числовое значение, которое оно представляет.
Для этого есть несколько функций. Они задокументированы здесь: http://www.cplusplus.com/reference/clibrary/cstdlib