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