2011-01-30 18 views
2

std::string("DEADBEEF")があるとします.2つの値をstd :: vector(おそらくstd::vector<unsigned char>、可能であれば)に格納する最もエレガントな方法は、std::vectorのようになります。{ 0xDE, 0xAD, 0xBE, 0xEF }配列だった?)そしてそれを元に戻す最も良い方法は何でしょうか(std::vector<unsigned char> - >std::string)。あなたは非常に高速であることを、この変換が必要な場合は、私はシンプルな無地のために行くだろうstd :: vectorのstd :: stringの16進値をstd :: vectorに格納していますか?

+0

んあなたのstd :: vectorは文字を保持しているか、バイナリデータから/に変換しようとしていますか? –

+0

私の記事を読んでくれてありがとう。バイナリは素晴らしい(固定ポスト#1) –

答えて

1

int hexValue(int c) 
{ 
    if (c >= '0' && c <= '9') return c - '0'; 
    if (c >= 'A' && c <= 'F') return c - 'A' + 10; 
    if (c >= 'a' && c <= 'f') return c - 'a' + 10; 
    return -1; 
} 

std::vector<unsigned char> toBin(const std::string& s) 
{ 
    std::vector<unsigned char> result; 
    for (int i=0,n=s.size(); i<n-1; i+=2) 
    { 
     int x1 = hexValue(s[i]); 
     int x2 = hexValue(s[i+1]); 
     if (x1 >= 0 && x2 >= 0) 
      result.push_back(x1*16 + x2); 
    } 
    return result; 
} 

std::string toHex(const std::vector<unsigned char>buf) 
{ 
    const char *hex = "ABCDEF"; 
    int n = buf.size(); 
    std::string result(n*2, ' '); 
    for (int i=0; i<n; i++) 
    { 
     result[i*2] = hex[buf[i]>>4]; 
     result[i*2+1] = hex[buf[i]&15]; 
    } 
    return result; 
} 

をループ...

std::vector<unsigned char> toBin(const std::string& s) 
{ 
    static unsigned char H[256], L[256]; 
    if (L['1'] == 0) 
    { 
     for (int i=0; i<10; i++) 
     { 
      H['0'+i] = (i<<4); 
      L['0'+i] = i; 
     } 
     for (int i=0; i<6; i++) 
     { 
      H['a'+i] = H['A'+i] = ((10+i)<<4); 
      L['a'+i] = L['A'+i] = (10+i); 
     } 
    } 
    std::vector<unsigned char> result(s.size()>>1); 
    for (int i=0,n=s.size(); i<n-1; i+=2) 
     result[i>>1] = H[s[i]]+L[s[i+1]]; 
    return result; 
} 
+0

ああ...すみません。私は鞭、針、 ''、 'bind1st'、' 'のようなマゾヒスティックなものではありません... – 6502

+0

シンプルで甘い解決策! – likejiujitsu

1

方法(入力と仮定すると、十分と正式に正しい大きさです) (なしファンシーSTLジャグリングが)について:

#include <string> 
#include <vector> 

// exception thrown by the encoder 
class DecodeError { 
public: 
    DecodeError() {} 
    DecodeError(const char* s): msg(s) {} 
    DecodeError(const std::string& s): msg(s) {} 
    const char* what() { return msg.c_str(); } 
private: 
    std::string msg; 
}; 

class HexEncoder { 
public: 
    void decode(const std::string& str, std::vector<unsigned char>& v); 
private: 
    unsigned char decode(char); 
}; 

void HexEncoder::decode(const std::string& s, std::vector<unsigned char>& v) 
{ 
    if (s.size() % 2 != 0) 
     throw DecodeError("invalid string length"); 

    v.reserve(s.size()/2); 
    std::string::const_iterator it=s.begin(); 
    while (it != s.end()) { 
     unsigned char nibble1 = decode(*it++); 
     unsigned char nibble2 = decode(*it++); 
     v.push_back(nibble1 << 4 + nibble2); 
    } 
} 

unsigned char HexEncoder::decode(char c) 
{ 
    if (c >= '0' && c <= '9') 
     return c - '0'; 
    if (c >= 'A' && c <= 'F') 
     return c - 'A' + 10; 
    if (c >= 'a' && c <= 'f') 
     return c - 'a' + 10; 
    throw DecodeError("invalid character"); 
} 

int main() 
{ 
    std::string s("DEADBEEF"); 

    std::vector<unsigned char> v; 

    HexEncoder enc; 
    enc.decode(s, v); 
} 
1
for(std::iterator<string> it = str.begin(); it != str.end(); std::advance(it, 2)) 
{ 
    char tmp; 
    std::copy(it, it + 2, tmp); 
    scanf("%02X", &tmp); 
    vect.push_back(tmp); 
} 

これは変換の草案ですが、正しく動作するかどうかはわかりません。

+0

どの試みが最も効率的なのだろうか...これはかなりいいね。 –

1

私のプロジェクトはすでにboostに依存したように、私はboost/algorithm/hex.hppを使用したいが:進への変換

#include <string> 
#include <vector> 
#include <iterator> 

#include <boost/algorithm/hex.hpp> 

... 

string stringValue("DEADBEEF"); 
vector<unsigned char> vectorValue; 

がString:文字列への変換進のために

boost::algorithm::unhex(stringValue, back_inserter(vectorValue)); 

boost::algorithm::hex(vectorValue, back_inserter(stringValue)); 
関連する問題