在C中减少十六进制格式的二进制数

时间:2014-10-29 16:29:55

标签: c string

我正在使用一个生成数百万个二进制字符串的程序,我需要将它们保存在内存中的二叉树中,但字符串是2048个字符长(1001011 .... 101)。到目前为止,我已将它们转换为十六进制格式,并且可以获得512个字符串,实现只存储原始字符串大小的1/4,但它仍然太大,无法将所有这些字符串保留在内存中。所以我想知道是否有办法减少二进制字符串,甚至更加保证每个转换字符串的唯一性。谢谢!

6 个答案:

答案 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等函数,这些函数采用明确的字节数。