2017-06-17 129 views
0

我有20byte二進制char數組。我想分成3個部分:4byte,8byte,8byte。我像下面這樣實現它。它的工作原理,但似乎我可能能夠使用緩衝區流。我想知道如何使用它。將二進制char數組轉換爲stringstream並從緩衝區彈出

現在

void main() 
{ 
    // _data is 20byte binary char array. 0000000000000000000000000000000000000000000001111001110001111111001110000010110000001011101101000000000000000000000000000000000000000000000000000000000000000001 

    // strA (4 byte) 
    string strA; 
    for (std::size_t i = 0; i < 4; ++i) { 
     strA += bitset<8>(_data.c_str()[i]).to_string(); 
    } 

    cout << strA << endl; // 00000000000000000000000000000000 

    // strB (8 byte) 
    string strB; 
    for (std::size_t i = 4; i < 12; ++i) { 
     strB += bitset<8>(_data.c_str()[i]).to_string(); 
    } 

    cout << strB << endl; // 0000000000000111100111000111111100111000001011000000101110110100 

    // strC (8 byte) 
    string strC; 
    for (std::size_t i = 12; i < 20; ++i) { 
     strC += bitset<8>(_data.c_str()[i]).to_string(); 
    } 

    cout << strC << endl; // 0000000000000000000000000000000000000000000000000000000000000001 
} 

期望

我想要實現這樣的。

void main() 
{ 
    stringstream ss = _data; 
    strA = ss.pop(4); 
    strB = ss.pop(8); 
    strC = ss.pop(8); 
} 

更新1

謝謝你們。我正在嘗試你給我的所有答案。我是C++新手,所以需要時間來理解它。以下是Anders K的一個。

struct S { char four[4]; char eight1[8]; char eight2[8]; }; 
struct S *p = reinterpret_cast<S*>(&_data); 
cout << p->four << endl; // => Output "(" I think I can find way to output 

更新2

它可以使用字符串:: SUBSTR。謝謝扎基爾。

int main() 
{ 
    // I don't know how to change to string value in smart way.. 
    string str; 
    for (std::size_t i = 0; i < _data.size(); ++i) { 
     str += bitset<8>(_data.c_str()[i]).to_string(); 
    } 

    cout << str << endl; // 0000000000000000000000000000000000000000000001111001110001111111001110000010110000001011101101000000000000000000000000000000000000000000000000000000000000000001 

    std::string d = str; // Your binary stream goes here 
    int lenA = (4*8); // First 4 Bytes 
    int lenB = (8*8); // Second 8 Bytes 
    int lenC = (8*8); // Last 8 Bytes 

    std::string strA = d.substr(0, lenA); 
    std::string strB = d.substr(lenA + 1, lenB - 1); 
    std::string strC = d.substr(lenA + lenB + 1, lenC - 1); 

    cout << strA << endl; // 00000000000000000000000000000000 
    cout << strB << endl; // 000000000000111100111000111111100111000001011000000101110110100 
    cout << strC << endl; // 000000000000000000000000000000000000000000000000000000000000001 
} 

更新3

當我嘗試雪夫的方式我得到了一個錯誤。這是我的錯,我想我可以解決它。我想我應該重新考慮_data的類型。

int main 
{ 
    const char data = _data; 
    const char *iter = data; 
    string strA = pop(iter, 4); 
    string strB = pop(iter, 8); 
    string strC = pop(iter, 8); 
    cout << "strA: '" << strA << "'" << endl; 
    cout << "strB: '" << strB << "'" << endl; 
    cout << "strC: '" << strC << "'" << endl; 
} 

使錯誤消息

​​
+1

爲什麼你要使用'stringstream'而不是'string'?並且'void main()'應該是'int main()' – Curious

+1

將它們分組在一個'struct'或'class'中是不是更容易?這些部分必須有一些特定的名稱,以便在分組中使用它更容易。如果你使用'class',你可以包裝內部細節並公開一個很好的界面來訪問這三個部分。 – Azeem

+1

爲什麼不做類似'struct S {char four [4]; char eight1 [8]; char eight2 [8]; }; struct S * p = reinterpret_cast (&_data [0]); '看起來不像是矯枉過正。 –

回答

1

我可以用string::substr

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string _data="00010001001000100011001101000100\ 
0101010101100110011101111000100010011001101010101011101111001100\ 
1101110111101110111111111101111010101101101111101110111100000000"; 

    int lenA = (4*8); //First 4 Bytes 
    int lenB = (8*8); //Second 8 Bytes 
    int lenC = (16*8); //Last 16 Bytes 

    string strA = _data.substr(0, lenA - 1); 
    string strB = _data.substr(lenA, lenB - 1); 
    string strC = _data.substr(lenB, lenC - 1); 

    std::cout << "strA: " << strA << endl; 
    std::cout << "strB: " << strB << endl; 
    std::cout << "strC: " << strC << endl; 


    return 0; 
} 

這是整潔和簡單,但得到你的工作做了你提出一個非常簡單的替代
演示here

輸出: -

strA: 0001000100100010001100110100010 
strB: 010101010110011001110111100010001001100110101010101110111100110 
strC: 100110011010101010111011110011001101110111101110111111111101111010101101101111101110111100000000 
+0

您是否注意到數據字節的預期按位輸出? – Scheff

+0

嗨@Scheff:我的輸入本身就是一個字符串的按位數據流 - 已經過測試 – Zakir

+0

好吧,但是OP的目的是提供數據字節,這些字節應該被分段轉換爲具有各個位的字符串。 (請注意使用的bitset <8>().to_string()'。) – Scheff

2

這是不可能作出新的方法std::stringstream。 (至少,我不會推薦這個。)

相反,我會建議使它成爲一個函數。用法是相似的。

#include <bitset> 
#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

string pop(istream &in, size_t n) 
{ 
    string ret; 
    while (n--) { 
    unsigned char byte = (unsigned char)in.get(); 
    ret += bitset<8>(byte).to_string(); 
    }  
    return ret; 
} 

int main() 
{ 
    string data(
    "\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa" 
    "\xbb\xcc\xdd\xee\xff\xde\xad\xbe\xef\x00", 20); 
    istringstream in; in.str(data); 
    string strA = pop(in, 4); 
    string strB = pop(in, 8); 
    string strC = pop(in, 8); 
    cout << "strA: '" << strA << "'" << endl; 
    cout << "strB: '" << strB << "'" << endl; 
    cout << "strC: '" << strC << "'" << endl; 
    return 0; 
} 

輸出:

strA: '00010001001000100011001101000100' 
strB: '0101010101100110011101111000100010011001101010101011101111001100' 
strC: '1101110111101110111111111101111010101101101111101110111100000000' 

注:

  1. 使用std::istream使得它適用於從std::istream派生的任何流。

  2. pop()沒有錯誤處理。因此,如果傳遞的流以後不是good(),則返回的結果pop()可能是錯誤的。

Btw。我同意std::stream可能「過度設計」的評論。因此,這裏的「輕量級」版本:

​​

輸出與上面相同。

注:

  1. char[]char*的使用是超出綁定訪問敏感得多。因此,必須謹慎使用。

  2. 我不太確定(unsigned char)演員是否必要。正如我經常看到有關char,int和符號擴展的「有趣」效果,我想它不會受傷。 (我覺得它更好。)

+0

非常感謝。我現在試圖在我的環境中使用你的代碼。 – zono