Как преобразовать char * в unsigned short в C ++ - PullRequest
8 голосов
/ 23 июня 2010

У меня есть char* name, которое является строковым представлением короткого замыкания, которое я хочу, например, "15", и мне нужно вывести его как unsigned short unitId в двоичный файл.Этот бросок также должен быть кросс-платформенным.

Это правильный состав: unitId = unsigned short(temp);

Обратите внимание, что я нахожусь на начальном уровне в понимании двоичного кода.

Ответы [ 6 ]

17 голосов
/ 23 июня 2010

Я предполагаю, что ваш char* name содержит строку представление короткого замыкания, которое вы хотите, т.е. "15".

Do not приведение char* непосредственно к типу без указателя. Приведения в C на самом деле вообще не изменяют данные (за некоторыми исключениями) - они просто сообщают компилятору, что вы хотите преобразовать один тип в другой. Если вы преобразуете char* в unsigned short, вы будете принимать значение указателя (которое не имеет ничего общего с содержимым), отсекая все, что не вписывается в short, а затем выбрасывает все остальное. Это абсолютно не то, что вы хотите.

Вместо этого используйте функцию std::strtoul, которая анализирует строку и возвращает вам эквивалентное число:

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

(Вам все еще нужно использовать приведение, потому что strtoul возвращает unsigned long. Однако это приведение происходит между двумя различными целочисленными типами, и поэтому является допустимым. Худшее, что может случиться, это то, что число внутри name слишком велик, чтобы вписаться в short - ситуацию, которую вы можете проверить в другом месте.)

9 голосов
/ 23 июня 2010
#include <boost/lexical_cast.hpp>

unitId = boost::lexical_cast<unsigned short>(temp);
6 голосов
/ 23 июня 2010

Чтобы преобразовать строку в двоичную в 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.
    }
}
2 голосов
/ 23 июня 2010

это приведение даст вам (усеченную) целочисленную версию указателя, предполагая, что temp также является char *. Это почти наверняка не то, что вы хотите (и синтаксис тоже неправильный). Посмотрите на функцию Atoi, это может быть то, что вам нужно, например, unitId = (беззнаковый short) (atoi (temp)); Обратите внимание, что это предполагает, что (a) temp указывает на строку цифр и (b) цифры представляют число, которое может вписаться в беззнаковое короткое число

0 голосов
/ 23 июня 2010

Если у вас есть строковое (char * in C) представление числа, вы должны использовать соответствующую функцию для преобразования этой строки в числовое значение, которое она представляет.

Для этого есть несколько функций. Они задокументированы здесь: http://www.cplusplus.com/reference/clibrary/cstdlib

0 голосов
/ 23 июня 2010

Указатель name - это идентификатор или строка символов, на которую указывает name? То есть, если name содержит "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. */
}

Будьте осторожны при записи двоичных значений в файл; результат выполнения очевидного действия может теперь сработать, но, скорее всего, не будет переносимым.

...