0

1 と 0 の文字列があり、その長さを 8 で割り切れるように十分な 0 を埋め込んでいます。私の目標は、この文字列をバイト数に変換し、最初に読み取った文字が最下位ビット、次に次の最下位ビットなど、8ビットを読み取るまで、それをバイトとして保存し、文字列の読み取りを続けて、次のビットを2番目のバイトの最下位ビットとして保存します。

例として、文字列「0101101101010010」は長さが 16 であるため、2 バイトに変換されます。1 バイト目は「11011010」、2 バイト目は「01001010」である必要があります。

文字列を逆にするほど簡単ではないため、これを行う方法がわかりません(これらのバイトの順序を維持する必要があります)。

どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

3

文字列を逆方向に反復することもできますが、提案したように逆にする方が簡単かもしれません。そこから、一度に 1 つずつバイトを作成できます。ネストされた for ループはうまく機能します。

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 の場合はビットを設定し、そうでない場合は未設定のままにします。右シフトを使用しているため、バイト配列が符号なしであることが重要です。

于 2013-07-28T22:33:14.310 に答える
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;
}
于 2013-07-28T23:05:12.990 に答える
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
}
于 2013-07-28T22:35:59.340 に答える