2017-01-03 4 views
0

문자열을 바이너리 코드로 변환하는 간단한 프로그램을 만들고 있습니다. 나는 우분투 작업 및 리눅스 빌드는 윈도우가 컴파일에서 잘 실행되는 동안 비주얼 스튜디오 2015과 Windows에서 프로그램을 컴파일하고 싶었지만 기능 다음 호출 할 때std :: bitset을 사용할 때 프로그램이 충돌하지만 VC를 사용하여 컴파일 할 때만 발생합니다. 2015

bitset<N> char 

같은과 충돌 해요 :

bool bin2string(std::string *psBinaryString, std::string *psCharakterString) 
{ 
psCharakterString->clear(); 
char cTempArray[8]; 
char cTemp; 

for(unsigned int i = 0; i < psBinaryString->length(); i += 8) 
{ 
    for(unsigned int j = 0; j < 8; ++j) 
    { 
     cTempArray[j] = psBinaryString->c_str()[j + i]; 
    } 
    std::bitset<8> Bitset(cTempArray); 
    cTemp = static_cast<char>(Bitset.to_ulong()); 
    psCharakterString->push_back(cTemp); 
} 
return true; 
} 

내 질문에이 코드의 문제점은 무엇입니까? Linux (gcc) 및 Windows (MinGW)에서는 작동하지만 Visual Studio 2015에서는 Windows에서 작동하지 않는 이유는 무엇입니까? 이것에 대한

나의 현재 workarround는이 두 솔루션의

#ifdef _WIN32 

bool bin2string(std::string *psBinaryString, std::string  *psCharakterString) 
{ 
psCharakterString->clear(); 
char cTempArray[8]; 
char cTemp; 

for(size_t i = 0; i < psBinaryString->length(); i += 8) 
{ 
    for(size_t j = 0; j < 8; ++j) 
    { 
     cTempArray[j] = psBinaryString->c_str()[j + i]; 
    } 
    cTemp = static_cast<char>(strtol(cTempArray, 0, 2)); 
    psCharakterString->push_back(cTemp); 
} 
return true; 
} 

#else 

bool bin2string(std::string *psBinaryString, std::string *psCharakterString) 
{ 
psCharakterString->clear(); 
char cTempArray[8]; 
char cTemp; 

for(unsigned int i = 0; i < psBinaryString->length(); i += 8) 
{ 
    for(unsigned int j = 0; j < 8; ++j) 
    { 
     cTempArray[j] = psBinaryString->c_str()[j + i]; 
    } 
    std::bitset<8> Bitset(cTempArray); 
    cTemp = static_cast<char>(Bitset.to_ulong()); 
    psCharakterString->push_back(cTemp); 
} 
return true; 
} 

#endif 

어느 쪽이 더 나은 무엇입니까?

+2

당신은 "충돌"이란 무엇을 의미합니까? 실제로는 어떻게됩니까? –

+4

설명서에 따르면 : http://en.cppreference.com/w/cpp/utility/bitset/bitset 비트 집합의 생성자는 배열 길이가 지정되지 않은 경우 Null로 끝나는 문자열을 필요로합니다. 리눅스에서 작동하는 것은 다행입니다. – Frank

+0

@Frank 아래 답변 상자가 있습니다. – NathanOliver

답변

4

크래시는 std :: bitset의 생성자가 배열 길이 또는 null로 끝나는 문자열을 필요로하기 때문에 발생합니다.

사용한다 그래서

(http://en.cppreference.com/w/cpp/utility/bitset/bitset의 설명서를 참조하십시오) :

std::bitset<8> Bitset(cTempArray, 8);