超快速方式连接字节值

时间:2011-07-26 17:55:33

标签: c++ string byte

给出3个不同的字节,比如说x = 64,y = 90,z = 240我希望将它们连接成一个像6490240这样的字符串。如果这样可行但它不会很可爱:

 string xx = (string)x + (string)y + (string)z;

我正在使用C ++工作,并且会使用8位表示法将字节串联为24位字符串。

它需要超快,因为我在很多数据上使用这种方法,并且看起来令人沮丧的是,他们不能只是说这个字节就好像它是一个字符串一样。

非常感谢你的帮助

为了澄清,我特别关注使用3个字节的原因是因为原始数据属于RGB值,这些值通过指针读取并且当然作为字节存储在内存中。

我想要一种真正独立处理每种颜色的方法,以便您可以将其视为散列函数。因此,需要任何没有碰撞的快速表示。这是我能想到避免任何碰撞的唯一方法。

5 个答案:

答案 0 :(得分:10)

将数字转换为字符串的最简单方法是使用ostringstream

#include <sstream>
#include <string>
std::ostringstream os;
os << x << y << z;
std::string str = os.str();   // 6490240

您甚至可以使用操纵器以十六进制或八进制执行此操作:

os << std::hex << x << y << z;

<强>更新

既然你已经澄清了你真正想做的事情,我已经更新了我的答案。您希望将RGB值作为三个字节,并以某种方式将它们用作键。这最好使用long int,而不是字符串。你仍然可以很容易地对int进行字符串化,以便打印到屏幕上。

unsigned long rgb = 0;
byte* b = reinterpret_cast<byte*>(&rgb);
b[0] = x;
b[1] = y;
b[2] = z;
// rgb is now the bytes { 0, x, y, z }

然后,您可以非常有效地使用long int rgb作为您的密钥。无论何时你想打印出来,你仍然可以这样做:

std::cout << std::hex << rgb;

根据系统的字节顺序,您可能需要使用您设置的long int的哪些字节。我的示例覆盖了字节0-2,但您可能希望写入字节1-3。您可能希望将顺序写为z,y,x而不是x,y,z。这种细节取决于平台。虽然如果您不想打印RGB值,但只是想将其视为哈希值,那么您无需担心自己编写的字节数或顺序。

答案 1 :(得分:8)

您是否考虑过将颜色元素打包成整数的三个字节?

uint32_t full_color = (x << 16) | (y << 8) | z;

答案 2 :(得分:2)

尝试sprintf(xx,"%d%d%d",x,y,z);

答案 3 :(得分:2)

使用3个字符的字符数组作为24位表示,并为每个char分配一个输入值的值。

答案 4 :(得分:1)

将3个字节转换为位并将结果存储在数组中可以轻松完成,如下所示:

void bytes2bits(unsigned char x, unsigned char y, unsigned char z, char * res)
{
    res += 24; *res-- = 0;
    unsigned xyz = (x<<16)+(y<<8)+z;
    for (size_t l = 0 ; l < 24 ; l++){
        *res-- = '0'+(xyz & 1); xyz >>= 1;
    }

}

但是,如果您正在寻找一种以非模糊和紧凑的方式存储三个字节值的方法,那么您应该选择十六进制。 (二进制表示的每组四位匹配0到9之间的数字或A到F之间的字母)。它非常简单,编码和解码非常简单,也适合人类可读的输出。

如果您永远不需要打印输出结果,只需将这些值组合为一个整数并将其用作建议Mark的关键字肯定是最快且最简单的解决方案。假设目标系统上的本机整数为32位或更多,只需执行:

unsigned int key = (x<< 16)|(y<<8)|z;

如果需要,您可以轻松地从密钥中获取初始值:

unsigned char x = (key >> 16) & 0xFF;
unsigned char y = (key >> 8) & 0xFF;
unsigned char z = key & 0xFF;