我有一个char* name
,它是我想要的短片的字符串表示,例如“15”,需要将其作为unsigned short unitId
输出到二进制文件。此演员表也必须是跨平台兼容的。
这是正确的演员:unitId = unsigned short(temp);
请注意我在理解二进制文件方面处于初级阶段。
答案 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