给出3个不同的字节,比如说x = 64,y = 90,z = 240我希望将它们连接成一个像6490240这样的字符串。如果这样可行但它不会很可爱:
string xx = (string)x + (string)y + (string)z;
我正在使用C ++工作,并且会使用8位表示法将字节串联为24位字符串。
它需要超快,因为我在很多数据上使用这种方法,并且看起来令人沮丧的是,他们不能只是说这个字节就好像它是一个字符串一样。
非常感谢你的帮助
为了澄清,我特别关注使用3个字节的原因是因为原始数据属于RGB值,这些值通过指针读取并且当然作为字节存储在内存中。
我想要一种真正独立处理每种颜色的方法,以便您可以将其视为散列函数。因此,需要任何没有碰撞的快速表示。这是我能想到避免任何碰撞的唯一方法。
答案 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;