我正在尝试通过网络发送数据包,因此希望它尽可能小(就大小而言)。
每个输入都可以包含公共前缀子字符串,如ABCD
。在这种情况下,我只想发送一个单词,1
表示当前字符串具有相同的前缀ABCD
并将其附加到剩余的字符串。因此,如果字符串为ABCDEF
,我会发送1EF
;如果是LKMPS
,我希望按原样发送字符串LKMPS
。
有人可以指出我如何在字符串中添加一些内容吗?
编辑:我知道在字符串中添加1
并不意味着这个1
有点 - 它只是我添加到字符串中的一个字符。这正是我的问题 - 对于每个字符串,我如何发送一个表示前缀匹配的位?然后发送不同的字符串的剩余部分?
答案 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;
}
}
话虽如此,网络现在非常快,所以我不会这样做。