向字符串

时间:2018-06-07 21:26:28

标签: c++ bit

我正在尝试通过网络发送数据包,因此希望它尽可能小(就大小而言)。

每个输入都可以包含公共前缀子字符串,如ABCD。在这种情况下,我只想发送一个单词,1表示当前字符串具有相同的前缀ABCD并将其附加到剩余的字符串。因此,如果字符串为ABCDEF,我会发送1EF;如果是LKMPS,我希望按原样发送字符串LKMPS

有人可以指出我如何在字符串中添加一些内容吗?

编辑:我知道在字符串中添加1并不意味着这个1有点 - 它只是我添加到字符串中的一个字符。这正是我的问题 - 对于每个字符串,我如何发送一个表示前缀匹配的位?然后发送不同的字符串的剩余部分?

3 个答案:

答案 0 :(得分:0)

如果您正在使用缓冲区以在通信协议中使用,则通常不应该是std::string。标准字符串不能用作缓冲区;并且它们通常不会在任何地方预先安装。

std::vector<std::byte>可能会为您提供更好的服务;或者(编译时固定大小)std::array。或者,再一次,你自己制作的一类。如果你想要你的&#34;就地&#34;尤其如此。预先添加位或字符,不仅为缓冲区保留相同的内存范围,而且实际上不移动任何现有数据。为此,你需要两倍于缓冲区的最大长度,并在中间启动它,这样你就可以在不改变任何东西的情况下附加或前置数据 - 同时保持位分辨率&#34;指针&#34;到缓冲区的整个部分的有效开始和结束。这是很容易实现的,是的,你猜对了,你自己的自定义缓冲类。

答案 1 :(得分:0)

在常见的网络硬件中,您无法发送单个位。大多数架构也无法解决单个位。

但是,您仍然可以使用您可能未使用的其中一个位来最小化所需的大小。例如,如果您的字符串只包含7位ASCII字符,则可以使用最高位对字符串的第一个字节中所需的信息进行编码。

例如,如果第一个字节是:

0b01000001 == 0x41 == 'A' 

然后使用|设置最高位:

(0b01000001 | 0x80) == 0b11000001 == 0xC1

要测试该位,请使用&

(0b01000001 & 0x80) == 0
(0b11000001 & 0x80) != 0

删除该位(在设置它的情况下)以取回原始的第一个字节:

(0b11000001 & 0x7F) == 0b01000001 == 0x41 == 'A'

答案 2 :(得分:-1)

我认为你可以使用的最小内存量是8位。

如果您想使用位操作,可以指定8个前缀,如下所示:

#include <iostream>

using namespace std;

enum message_header {
    prefix_on = 1 << 0,
    bitdata_1 = 1 << 1,
    bitdata_2 = 1 << 2,
    bitdata_3 = 1 << 3,
    bitdata_4 = 1 << 4,
    bitdata_5 = 1 << 5,
    bitdata_6 = 1 << 6,
    bitdata_7 = 1 << 7,
};

int main() {
    uint8_t a(0);

    a ^= prefix_1;

    if(a & prefix_on) {
        std::cout << "prefix_on" << std::endl;
    }
}

话虽如此,网络现在非常快,所以我不会这样做。