【问题标题】:Difference between byte size of C-StringC-String的字节大小之间的差异
【发布时间】:2012-09-19 03:04:15
【问题描述】:

我一直在为我的数据网络课程工作,他们要求我连接这样的标题:

struct ip
{
    unsigned long a;
    unsigned long b;
    unsigned int l;
} IP;

还有一条消息,它是一个字符*,让我们说“你好”。

所以,我使用这种方法将这两个连接到一个 char* 中:

memcpy(sendBuf, (void*)&sendHeader, sizeof(sendHeader));
memcpy(&sendBuf[sizeof(sendHeader)], readMessage, lengthMessage);

其中lengthMessage 是消息的字符数+1,它是空终止字符。

所以,sendBuf 是这样定义的:

char sendBuf[BUFLEN + 1]   // BUF_LEN = 128

然后我把这个 char* 放到一个这样定义的队列中:

concurrency::concurrent_queue<char*> IP_in_queue;

所以,我想检查信息是否正确,所以我只是检查所有内容:

char* s;
IP_in_queue.try_pop(s);
numbytes = sizeof(s);
// Copy from buf to the header
memcpy( (void*)&readHeader, s, sizeof( IP_PACKET_HEADER_T));
// Copy message part
memcpy( sendedString, &s[sizeof(IP_PACKET_HEADER_T)], numbytes - sizeof(IP_PACKET_HEADER_T));
// Append \0 to the end
sendedString[numbytes - sizeof(IP_PACKET_HEADER_T)] = '\0';

所以,在我排队我的 char* 之前,我们知道 sendBuf 的大小是 129,但是当我检查出队后的字节数时,它的差异太大了,字节数的值是 4,但即使在这样我得到的信息是正确的,所以我不明白,也许我错过了一些重要的东西,但变量 numbytes 至少不应该更多?

我希望我说清楚了,也许有人可以更好地解释一下。

谢谢

【问题讨论】:

    标签: c char byte sizeof


    【解决方案1】:

    sizeof 不会告诉你字符串的长度——它会告诉你char* 类型的大小,在 32 位机器上是 4 个字节。你想要strlen,字符串中的字节数。

    但即使这样也不是你想要的。你的结构IP 可以有空值,所以即使strlen 也不会给你一个正确的答案。如果你把你的字符串放在第一位而不是最后一个,你可以解决这个问题,但我会考虑这种黑客行为。您应该将大小显式添加到消息的开头。

    【讨论】:

    • 所以,如果我理解正确的话,我应该存储一个连接过程的长度变量,假设我的消息是Hello,那么它会是5个字节加上我的IP结构的sizeof,对吧?并在每个连接过程中存储我的 char* 的实际长度?
    • 无论您存储5 还是5+sizeof(IP),只要您可以仅从s 重构所有片段的大小即可。确保以一种可以从s 中明确提取的方式存储实际长度。
    • 但这是我的问题,该数据包的实际大小(以字节为单位)应该是 5 + sizeof(IP) 对吧?,是的,我知道如何用他的大小存储连接头 + 消息,但是问题是如何获得串联的实际大小。
    • 如果你想不通,那你就有麻烦了。数一数你memcpying 的字节数。
    • 是的,非常感谢,我真的很困惑哈哈抱歉!这是一个非常愚蠢的错误。感谢大家的帮助!
    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 2010-12-03
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多