如何在C ++中将char *转换为unsigned short

时间:2010-06-23 15:18:39

标签: c++ c pointers casting char

我有一个char* name,它是我想要的短片的字符串表示,例如“15”,需要将其作为unsigned short unitId输出到二进制文件。此演员表也必须是跨平台兼容的。

这是正确的演员:unitId = unsigned short(temp);

请注意我在理解二进制文件方面处于初级阶段。

6 个答案:

答案 0 :(得分:17)

我认为您的char* name包含您想要的短片的字符串表示,即"15"

直接将char*转换为非指针类型。 C语言中的强制转换实际上根本不会更改数据(除了少数例外) - 它们只是通知编译器您希望将一种类型转换为另一种类型。如果您将char*投射到unsigned short,您将获取指针的值(与内容无关),切断所有内容不适合short,然后扔掉其余的。这绝对不是你想要的。

而是使用std::strtoul函数,它解析字符串并返回相应的数字:

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

(你仍然需要使用强制转换,因为strtoul返回一个unsigned long。这个强制转换是在两种不同的整数类型之间,因此是有效的。可能发生的最坏情况是name内的数字太大,无法容纳short - 您可以在其他地方查看的情况。)

答案 1 :(得分:9)

#include <boost/lexical_cast.hpp>

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

答案 2 :(得分:6)

要在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.
    }
}

答案 3 :(得分:2)

如果temp也是char *,那么cast会给你(​​一个截断的)整数版本的指针。这几乎肯定不是你想要的(语法也是错误的)。 看看函数atoi,它可能是你需要的,例如unitId =(unsigned short)(atoi(temp)); 请注意,这假定(a)temp指向一串数字,(b)数字表示可以放入无符号短语的数字

答案 4 :(得分:0)

指针 name是id,还是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. */
}

小心将二进制值写入文件;做一件显而易见的事情的结果现在可能有用,但可能无法移植。

答案 5 :(得分:0)

如果您有一个字符串(C中的char *)表示数字,您必须使用适当的函数将该字符串转换为它所代表的数值。

这样做有几个功能。它们记录在这里: http://www.cplusplus.com/reference/clibrary/cstdlib