无法从字符指针复制到短

Can't copy from char pointer to short

本文关键字:复制 指针 字符      更新时间:2023-10-16

我有一个包含以下信息的字符指针:

char* data = "22";

我想将其从字符复制到一个短变量中。我有以下代码:

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;

提前致谢

让我们看一下内存,假设 short 的大小是 char 大小的两倍(并非总是如此!

带有"22"字符串的字符数组在内存中:

50

50

所以基本上

00110010 00110010

当你把它短到一个短的,你会得到一个数字,由两个字节组成:

00110010 00110010

翻译成十进制,意思是 12850。

现在,我认为您真的想将"22"ascii 表转换为"22"值。在这种情况下,您可以参考

将字符串转换为整数C++

如果您确实需要支持"23123dsdwdwqdwqdwqd"之类的字符串(这种情况很少见),您可以复制所需大小的子字符串并处理该子字符串。

请记住,当涉及到可变尺寸时,C++标准唯一保证

的是
sizeof(char) <= sizeof (short) <= sizeof(int) <= sizeof(long)

因此,如果您依赖于sizeof(short) = 2 * sizeof(char)的事实,那么您根本不是便携式的。

也许你的意思是以下内容

#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;
}