我正在使用一个生成数百万个二进制字符串的程序,我需要将它们保存在内存中的二叉树中,但字符串是2048个字符长(1001011 .... 101)。到目前为止,我已将它们转换为十六进制格式,并且可以获得512个字符串,实现只存储原始字符串大小的1/4,但它仍然太大,无法将所有这些字符串保留在内存中。所以我想知道是否有办法减少二进制字符串,甚至更加保证每个转换字符串的唯一性。谢谢!
答案 0 :(得分:2)
不要将字符串存储为字符串,将它们存储为原始数字。从某种意义上说,这相当于" Base-256"编码,可以这么说。当然,实际上这只是一个由字节组成的大型无符号整数。你可以用通常的方式对这些数字进行比较。
当您需要打印二进制字符串时,请根据需要格式化数字。换句话说,只有当您需要将值视为具有特定基数的字符串时,特定基数才应进入图片。
答案 1 :(得分:1)
您可以使用char数据类型在char中存储8位,即单个字符串的256 char数组。
要压缩更多,有必要监控您的数据模式。根据模式,您可以选择压缩算法来压缩数据。
答案 2 :(得分:0)
长度为8的数字1和0的字符串:"01010110"
,可以存储在一个字符(unsigned char
)中。
char中的1或0 /位的2048个字符= 256
从那以后,你必须使用压缩。
您可以使用位运算符或使用sprintf()
手动转换它例如:
unsigned char n = 0 ;
char* s = "11010110" ;
for( size_t i = 0 ; i < 8 ; i++ )
{
if( s[i] == '1' )
{
n |= 1u << ( 7 - i ) ;
}
}
依此类推,直到你还有任何输入为止。
答案 3 :(得分:0)
您应该使用其中一个免费的bignum库,例如GNU MP。还有其他较少受法律保护的图书馆。我很惊讶你已经没有使用过了 - 你是如何在第一时间生成2048位字符串的?
其次,为什么要将它们存储在内存中?为什么不在磁盘上?或者甚至使用数据库引擎?
这是家庭作业吗?
答案 4 :(得分:0)
嗯,我终于得到了一个很好的建议,工作正常。
double bin2double(unsigned char *binstr, size_t len)
{
double ret = 0;
size_t cur;
for(cur = 0; cur < len; cur++)
{
ret *= 1.001;
ret += binstr[cur] - 48;
}
return ret;
}
有了这个,我得到一个大小为len的每个不同的二进制字符串binstr的不同的double值,我可以很容易地加载到我的树上。谢谢大家。
答案 5 :(得分:-1)
如果您确实需要将数据视为字符串而不是二进制字节数组,则可以使用Base64 encoding将每24位转换为4个字符。这是对十六进制的改进,它将24位转换为6个字符。它仍然不如纯二进制表示,24位变成3个8位字符。
二进制数组的危险在于你不能使用字符串函数,因为任何8个0位的序列都将被解释为字符串的结尾。您需要使用memcmp
等函数,这些函数采用明确的字节数。