0

길이가 정확히 8로 나눌 수 있도록 0으로 채워진 1과 0의 문자열이 있습니다. 목표는이 문자열을 바이트 수로 변환하고 읽는 첫 번째 문자가 가장 작은 비트이고 그런 다음에 다음 비트가 그다지 중요하지 않은 식으로 정렬하는 것입니다. 8 비트를 읽을 때까지 다음 바이트를 두 번째 바이트의 가장 작은 비트로 저장하는 문자열을 계속 읽습니다.길이가 정확히 8의 배수가되는 '1과'0의 문자열을 특정 바이트 수로 변환

예를 들어 "0101101101010010"문자열은 길이가 16이므로 2 바이트로 변환됩니다. 첫 번째 바이트는 "11011010"이어야하고 두 번째 바이트는 "01001010"이어야합니다.

문자열을 뒤집을만큼 간단하지 않기 때문에이 작업을 수행하는 방법을 잘 모르겠습니다.이 바이트의 순서를 유지해야합니다.

도움 주시면 감사하겠습니다.

+4

"정확히 0으로 나눌 수 있습니까?" – P0W

+0

미안하지만 나는 8로 나눌 수 있다는 것을 의미합니다. 그것은 모듈러스에 대해 생각하고 있었고 모듈러스는 0이되었습니다. 작은 두뇌. – user0123

답변

2

문자열을 거꾸로 반복 할 수 있지만 제안을 반대로하면 쉽게 할 수 있습니다. 거기에서 한 번에 하나씩 바이트를 만들 수 있습니다. 루프 중첩이 잘 작동합니다 :

unsigned char bytes[8]; // Make sure this is zeroed 
for (int i=0, j=0; i<str.length(); j++) { 
    for (int k=0; k<8; k++, i++) { 
    bytes[j] >>= 1; 
    if (str[i] == '1') bytes[j] |= 0x80; 
    } 
} 

i 현재 문자열 인덱스, j은 현재의 바이트 배열 인덱스이며, 우리가 현재의 바이트에 설정 한 얼마나 많은 비트 k 계산됩니다. 현재 문자가 1이면 비트를 설정하고, 그렇지 않으면 설정을 해제합니다. 우드 시프트를 사용하고 있기 때문에 바이트 배열이 이고 서명이없는 인 것이 중요합니다.

+0

어디에서 이걸 늘리시겠습니까? 나는 코드에 대해 조금 혼란 스럽다. 편집 : nevermind 나는 내부 루프 for 루프의 끝의 일부로 증가 참조하십시오 – user0123

0

string::size/8을 사용하면 바이트 수를 얻을 수 있습니다.

그런 다음 하위 문자열을 뒤집어서 문제가됩니다. 당신은 그런 일을 할 수 :

for(int i=0; i<number_of_bytes; i++) 
{ 
    std::string temp_substr = original.substr(i*8,8); 
    std::reversed = string(temp_substr.rbegin(),temp_substr.rend()) // using reverse iterators 

    //now you can save that "byte" represented in the "reversed" string, for example using memcpy 
} 
0

는 범용 기능으로 노출하거나 같은 모든 문자 인 것으로 적용된 모든 권리 제약을 가질 수 있도록 할 클래스에 캡슐화 할 것인지 여부 따라 달라집니다 0 또는 1을 입력하십시오.

#include <cstdint> 
#include <string> 
#include <algorithm> 
#include <iostream> 

static const size_t BitsPerByte = 8; 

// Suitable for a member function where you know all the constraints are met. 
uint64_t crudeBinaryDecode(const std::string& src) 
{ 
    uint64_t value = 0; 
    const size_t numBits = src.size(); 
    for (size_t bitNo = 0; bitNo < numBits; ++bitNo) 
     value |= uint64_t(src[bitNo] - '0') << bitNo; 
    return value; 
} 

uint64_t clearerBinaryDecode(const std::string& src) 
{ 
    static const size_t BitsPerByte = 8; 
    if ((src.size() & (BitsPerByte - 1)) != 0) 
     throw std::invalid_argument("binary value must be padded to a byte size"); 
    uint64_t value = 0; 
    const size_t numBits = std::min(src.size(), sizeof(value) * BitsPerByte); 
    for (size_t bitNo = 0; bitNo < numBits; ++bitNo) { 
     uint64_t bitValue = (src[bitNo] == '0') ? 0ULL : 1ULL; 
     value |= bitValue << bitNo; 
    } 
    return value; 
} 

int main() 
{ 
    std::string dead("1011" "0101" "0111" "1011"); 
    std::string beef("1111" "0111" "0111" "1101"); 
    std::string bse ("1111" "0111" "0111" "1101" "1011" "0101" "0111" "1011" "1111" "0111" "0111" "1101" "1011" "0111" "0111" "1111"); 

    std::cout << std::hex; 

    std::cout << "'dead' is: " << crudeBinaryDecode(dead) << std::endl; 
    std::cout << "'beef' is: " << clearerBinaryDecode(beef) << std::endl; 

    std::cout << "'bse' is: " << crudeBinaryDecode(bse) << std::endl; 

    return 0; 
}