2012-10-15 68 views
0

我已經下載了一個圖像,它被保存在std::string。 現在我想用/有下列情況打開:C++字符串到uint8_t

typedef uint8_t byte //1 byte unsigned integer type. 
static open(const byte * data, long size) 

如何從string轉換爲byte*

/編輯:
我已經嘗試過這樣的:

_data = std::vector<byte>(s.begin(), s.end()); 
//_data = std::vector<uint8_t>(s.begin(), s.end()); //also fails, same error 
_p = &_data[0]; 
open(_p, _data.size()) 

,但我得到:
未定義的引用 '開放(無符號字符常量*長)'
爲什麼它錯誤地解釋字節作爲char ?!

/EDIT2: 只是爲了測試它,我改變函數調用來

open(*_p, _data.size()) 

但後來我得到:

error: no matching function for call to 'open(unsigned char&, size_t)' 
[...] open(const byte*, long int) <near match> 

所以功能definitly發現...

+0

你甚至檢查過'string'類的引用嗎?如果你看看例如[this reference](http://en.cppreference.com/w/cpp/string/basic_string),你將很快看到_two_函數來幫助你解決問題。 –

+0

爲什麼你將圖像數據存儲在'std :: string'中?字符串存儲一件事,只有一件事:**文本**。你應該使用不同的類(即一個字節向量)。 –

+1

啊,現在我看到你已經在字符串中存儲了二進制數據......這正如前面的評論者所說的那樣不可取。原因是二進制圖像數據可以包含值0,這是用於終止字符串的相同值。所以把它放在一個字符串中最有可能會給你一小部分圖像。 –

回答

2

兩種可能性:

1)常見的一個。在你的系統上,char是2的補碼或者是無符號的,因此讀取字符作爲無符號字符是「安全的」,並且(如果char被簽名),結果與從signed到unsigned的轉換相同。

在這種情況下,請使用reinterpret_cast<const uint8_t*>(string.data())

2)不尋常的一個。在您的系統上,char已簽名,而不是2的補碼,因此char *ptr指向負值,因此*(uint8_t*)ptr不等於(uint8_t)(*ptr)。然後根據實際對數據做什麼,上面的代碼可能沒有問題,或者您可能需要將數據從字符串中複製到uint8_t的容器中,然後轉換。例如,vector<uint8_t> v(string.begin(), string.end());。然後使用&v[0],前提是長度不是0(與字符串不同,即使您從不取消引用,也不允許您指向空向量的數據)。

非二進制補碼系統是約不存在的,即使有一個我認爲這是相當不可能的系統上char簽署,而不是2的補辦法所提供的所有uint8_t(因爲如果那麼做它還必須提供int8_t)。所以(2)只適合迂腐的完整性。

爲什麼它錯誤地解釋字節爲char

這是沒有錯的,uint8_tunsigned char您的系統上一個typedef。

+1

+1,以確保您免受學生的低估。 –

+0

@本傑明:我是其中的一個僧侶,雖然我不會因爲這樣的疏忽而失望。我可能會評論。 –

+0

我已經試過這個: –

0
std::string string_with_image; 

string_with_image.data(); 
+0

你不是指'data()'嗎? –

+0

@JoachimPileborg,你是真的。我錯打了那個。感謝您更正 – nothrow