C++ 向字符串中添加位值

C++ 向字符串中添加位值,c++,bit,C++,Bit,我试图通过网络发送数据包,因此希望它尽可能小(就大小而言) 每个输入可以包含一个公共前缀子字符串,如ABCD。在这种情况下,我只想发送一个位,比如说,1,表示当前字符串具有相同的前缀ABCD,并将其附加到剩余的字符串中。因此,如果字符串是ABCDEF,我将发送1EF;如果是LKMPS,我希望按原样发送字符串LKMPS 有人能指出我如何给字符串加上一点吗 编辑:我知道在字符串中添加1并不意味着这个1是一个位-它只是我添加到字符串中的一个字符。这正是我的问题——对于每个字符串,我如何发送一个表示前缀

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

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

有人能指出我如何给字符串加上一点吗


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

如果您使用的是用于通信协议的缓冲区,它通常不应该是
std::string
。标准字符串不打算用作缓冲区;而且它们通常不能预先准备好任何东西


有可能使用
std::vector
;或者通过(编译时固定大小)。或者,再一次,你自己打造的一个班级。如果您希望位或字符的“就地”预结尾不仅保持缓冲区的相同内存范围,而且实际上不移动任何现有数据,则尤其如此。为此,您需要两倍于缓冲区的最大长度,并从中间开始,这样您就可以在不移动任何内容的情况下追加或预结束数据,同时保持位分辨率“指针”指向缓冲区完整部分的有效开始和结束。这是很容易实现的,是的,你猜对了,你自己的自定义缓冲类。

我认为你能使用的最小内存量是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;
    }
}
#包括
使用名称空间std;
枚举消息头{

prefix_on=1在普通网络硬件中,您将无法发送单个位。而且大多数架构也无法处理单个位

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

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

0b01000001 == 0x41 == 'A' 
然后使用
|
设置最高位:

(0b01000001 | 0x80) == 0b11000001 == 0xC1
要测试位,请使用

(0b01000001 & 0x80) == 0
(0b11000001 & 0x80) != 0
要删除位(在设置该位的情况下)以返回原始的第一个字节,请执行以下操作:

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

为什么
-1
?请解释。我将进行编辑。
-1
的原因可能是您自己没有努力解决这个问题。
-1
不是一个代码编写网站。它是一个基于问答的网站,没有被我否决,但问题不清楚。请添加一些代码以显示您正在尝试做什么。您使用的数据类型是什么?
std::string
不能只追加一个位。您必须将其转换为字符。正如所写的那样,这个问题无法回答。不是我,但如果我必须猜测它将是“1EF”不表示添加到字符串中的位,而是一个包含3个字节的字符串,其中第一个字节是字符
1
。因此,由于您是否知道位是什么,以及我们通常不考虑将“位放入字符串”这一事实,这个问题看起来不清楚,以及软件级的网络层传输字节。@Fureeish,我已经提到了我正在考虑的方法。您还需要做什么工作?代码?除了简单(只需将1添加到字符串中)之外,它只有两行代码这是一个明智的建议,但我不确定这是对任何问题的回答。你说的
std::string
不能预先准备好是什么意思?一个
std::vector
如果不复制也不能预先准备好,但我不确定你为什么要在这种情况下预先准备任何东西。@Acorn:是的,我确定。至于
std::vect或者
-您可以保留足够的空间以确保预结束到位。@DrewDormann:我建议OP应该做些什么来应对OP面临的挑战。@einpoklum:确定什么?我的问题是为什么要预结束?至于
std::vector
:保留空间只会避免分配,而不会复制/m查看整个数据。由于您不知道此人使用的是什么体系结构,因此您的第一条和最后一条语句实际上都无效。您也有点忽略了要点。按您的方式使用位标志意味着可以进行组合,但这不是必需的,因此它实际上比使用简单的标记字符更浪费。当然,您可能会在数据流中使用高位来表示使用了前缀标记,但这完全取决于用户尚未提供的数据范围。请注意,当您对不清楚的问题提供简单的答案时,您会被否决。@paddy是的,我想您对前缀的看法是正确的,但我不是这么想的。Perhaps您可能会对一个与消息传递协议效率相关的更抽象的问题感兴趣。我将编辑代码。关于投票否决天真的答案,我将返回另一位用户关于“小心批评数百万人使用的东西”的评论。我想知道什么是“体系结构”会使它无效,为什么,谢谢。