Как преобразовать 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--ситуация, которую вы можете проверить в другом месте.)


#include <boost/lexical_cast.hpp>

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

чтобы преобразовать строку в двоичный файл в 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