我有一个char指针,其中包含以下信息:
char* data = "22";
我想将它从char复制到一个短变量中。 我有以下代码:
short BinarySerializer::getMessageTypeID(char* data)
{
short* messageTypeID;
memcpy( messageTypeID, data, sizeof( messageTypeID ) );
return *messageTypeID;
}
我不知道为什么,但是当我打印它时,我得到:12850。
这就是我打印它的方式:
short temp = msg->messageTypeID;
cout << "Message ID is: " << temp << endl;
提前致谢
答案 0 :(得分:1)
也许你的意思是以下内容
#include <iostream>
#include <sstream>
#include <numeric>
#include <cstring>
struct BinarySerializer
{
short getMessageTypeID( const char *data ) const;
short getMessageTypeID1( const char *data ) const;
};
short BinarySerializer::getMessageTypeID( const char *data ) const
{
short messageTypeID = 0;
std::istringstream is( data );
is >> messageTypeID;
return messageTypeID;
}
short BinarySerializer::getMessageTypeID1( const char *data ) const
{
short messageTypeID;
messageTypeID = std::accumulate( data, data + std::strlen( data ), ( short)0,
[]( short acc, char c )
{
return 10 * acc + ( c - '0' );
} );
return messageTypeID;
}
int main()
{
const char *s = "22";
std::cout << BinarySerializer().getMessageTypeID( s ) << std::endl;
std::cout << BinarySerializer().getMessageTypeID1( s ) << std::endl;
}
输出
22
22
如果数据看起来像"22sdfsd"
。那么你需要添加能找到第一个非数字值的代码。
您还可以使用函数std::strtol
并检查获取的值是否在short类型的值范围内。
例如(不检查获得的值是否对类型short有效)
short BinarySerializer::getMessageTypeID( const char *data ) const
{
short messageTypeID = 0;
messageTypeID = ( short )strtol( data, nullptr, 10 );
return messageTypeID;
}
答案 1 :(得分:1)
让我们看看内存,假设short的大小是char的两倍(并非总是如此!):
带有“22”字符串的char数组在内存中:
50 50
所以基本上
00110010 00110010
当你把它记为短片时,你会得到一个由两个字节组成的数字:
00110010 00110010
,翻译成十进制,表示12850。
现在,我认为你真的想将“22”ascii表转换为“22”值。在这种情况下,您可以参考
如果你真的需要支持像“23123dsdwdwqdwqd”这样的字符串(很少是这种情况),你可以复制一个所需大小的子字符串并处理子字符串。
请记住,在可变大小方面,只有C ++标准保证的是
sizeof(char) <= sizeof (short) <= sizeof(int) <= sizeof(long)
因此,如果您依赖sizeof(short) = 2 * sizeof(char)
这一事实,那么您根本就无法携带。