2016-11-29 43 views
2

我正在处理std::bitset<16>向量中的数据,它们都必须使用自制函数将字符串转换为和从无符号long(通过std::bitset::to_ulong())转换为字符串和从字符串转换为字符串(确切的算法是这个问题是无关的)为什么不相同的位集合转换为相同的ulong

bitset向量和字符串之间的转换首先看起来工作正常,因为如果我第一次转换bitset向量到字符串,然后回到bitset它是相同的;我已经通过使一个程序,它包括本证明:

for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<std::endl;//print bitsets before conversion 

bitset_to_string(my_bitset16vector,my_str); 
string_to_bitset(my_bitset16vector,my_str); 

std::cout<<std::endl 
for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<std::endl;//print bitsets after conversion 

输出可能看起来有点像这样(在这种情况下,只有4位集):

1011000011010000 
1001010000011011 
1110100001101111 
1001000011001111 

1011000011010000 
1001010000011011 
1110100001101111 
1001000011001111 

通过该判断,之前的位集和转换后显然是相同的,但是尽管如此,当我告诉他们转换为无符号长整型时,位集转换完全不同;在一个程序,它看起来是这样的:

for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<".to_ulong()="<<B.to_ulong()<<std::endl;//print bitsets before conversation 

bitset_to_string(my_bitset16vector,my_str); 
string_to_bitset(my_bitset16vector,my_str); 

std::cout<<std::endl 
for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<".to_ulong()="<<B.to_ulong()<<std::endl;//print bitsets after conversion 

输出可能看起来有点像这样:

1011000011010000.to_ulong()=11841744 
1001010000011011.to_ulong()=1938459 
1110100001101111.to_ulong()=22472815 
1001000011001111.to_ulong()=18649295 

1011000011010000.to_ulong()=45264 
1001010000011011.to_ulong()=37915 
1110100001101111.to_ulong()=59503 
1001000011001111.to_ulong()=37071 

首先显而易见的是,当所显示的位集仍然超越一切合理怀疑是相同的二进制,但当转换为无符号long时,相同的位集返回完全不同的值(完全破坏我的程序)

为什么t他?即使它们打印的是一样的,它可以是位集是不一致的吗?错误是否存在于字符串转换器的位集中,尽管位集是相同

编辑:并非包括我的对话在内的所有程序都有这个问题,它只发生在我创建后(从字符串)修改位集后,在我的情况下试图加密位集,而这根本不能砍倒一些简单和短期,但在我写作的最大压缩方式,它看起来是这样的:

(那就是即使不包括公共密钥结构和模块化电源功能的确定指标)

int main(int argc, char**argv) 
{ 
    if (argc != 3) 
    { 
     std::cout<<"only 2 arguments allowed: plaintext user"<<std::endl; 
     return 1; 
    } 

    unsigned long k=123456789;//any huge number loaded from an external file 
    unsigned long m=123456789;//any huge number loaded from an external file 


    std::vector< std::bitset<16> > data;  
    std::string datastring=std::string(argv[1]); 

    string_to_bitset(data,datastring);//string_to_bitset and bitset_to_string also empties string and bitset vector, this is not the cause of the problem 

    for (std::bitset<16>& C : data) 
    { 
     C =std::bitset<16>(modpow(C.to_ulong(),k,m));//repeated squaring to solve C.to_ulong()^k%m 
    } 

    //and now the problem happens  


    for (std::bitset<16>& C : data) std::cout<<C<<".to_ulong()="<<C.to_ullong()<<std::endl; 

    std::cout<<std::endl; 

    bitset_to_string(data,datastring); 
    string_to_bitset(data,datastring); 
    //bitset_to_string(data,datastring); 

    for (std::bitset<16>& C : data) std::cout<<C<<".to_ulong()="<<C.to_ullong()<<std::endl; 

    std::cout<<std::endl; 
return 0; 
} 

我很清楚,你现在都在想我正在做模块化功能错误(我guara但我所做的事情实际上并不重要,因为我的问题不是:我的计划有什么问题;我的问题是:为什么不相同的位集(打印相同的二进制1和0)转换为相同的无符号长整型。

其他编辑:我还必须指出,无符号长整数的第一个printet值是“正确的”,因为它们在使用时允许我完美地解密该位集,而之后打印的无符号长整型值是“错误的”它会产生完全错误的结果。

+0

请尝试提取重复此问题的最小一段代码(如展示此问题的小主文件)。我们不能看到如何将数据分配给位集的例子。 –

+2

你使用什么编译器? “11841744”的值在低16位是正确的,但是在16位以上有一些额外的设置位。这可能是你的STL实现中的一个bug,其中to_long访问超过它应该使用的16位。 – 1201ProgramAlarm

+0

原来你是对的@ 1201ProgramAlarm在我的情况下,16位是小到包含所有的数据,但我的编译器无论如何都将所有数据添加到位集,从16位升级到32位解决了我的问题;如果你可以发表你的评论作为答案,我会接受它 – Nikolaj

回答

1

“11841744”的值在低16位是正确的,但在16位以上有一些额外的设置位。这可能是你的STL实现中的一个bug,其中to_long访问超过它应该使用的16位。

或者(从您上面的评论中),您将向bitset添加更多位,而不是它可以容纳,并且您遇到未定义行为。

相关问题