我正在C++非託管項目中工作。從C++的std :: string獲取字節
我需要知道如何將字符串這樣的「一些數據進行加密」並獲得一個字節[]數組,我將使用它作爲加密源。
在C#我做
for (int i = 0; i < text.Length; i++)
buffer[i] = (byte)text[i];
我需要知道的是如何做相同的,但使用非託管C++。
謝謝!
我正在C++非託管項目中工作。從C++的std :: string獲取字節
我需要知道如何將字符串這樣的「一些數據進行加密」並獲得一個字節[]數組,我將使用它作爲加密源。
在C#我做
for (int i = 0; i < text.Length; i++)
buffer[i] = (byte)text[i];
我需要知道的是如何做相同的,但使用非託管C++。
謝謝!
如果你只需要只讀訪問,然後c_str()
將做到這一點:
char const *c = myString.c_str();
如果你需要讀/寫訪問,那麼你可以將字符串複製到一個載體。矢量爲您管理動態內存。你不必惹分配/釋放,則:
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
如果他想要一個字節數組,他是否需要終止'\ 0'?在這種情況下,您可以使用data()作爲只讀。 – 2009-02-02 22:37:23
我不確定他是否需要\ 0或不。如果他現在不知道他可以使用.data()。感謝您對此發表評論,Martin。 – 2009-02-02 22:48:44
從一個std ::字符串,如果你想在char_t緩衝區指針,你可以使用c_ptr()方法。
它看起來像你只是想將字符串的字符複製到一個新的緩衝區。我會簡單地使用std::string::copy功能:
length = str.copy(buffer, str.size());
如果這僅僅是普通的香草C,則:
strcpy(buffer, text.c_str());
假定緩衝區分配和大到足以容納的「文」的內容,這是你原來的代碼中的假設。
如果加密()以「爲const char *」,那麼你可以使用
encrypt(text.c_str())
,你不需要複製字符串。
通常,加密函數採取
encrypt(const void *ptr, size_t bufferSize);
作爲參數。您可以直接傳遞c_str和長度:
encrypt(strng.c_str(), strng.length());
這樣,額外的空間就會被分配或浪費。
std::string::data
似乎是足夠的和最有效的。如果你想使用memcpy有非const內存操作(奇怪加密),您可以將數據複製到緩衝區:
unsigned char buffer[mystring.length()];
memcpy(buffer, mystring.data(), mystring.length());
STL的fanboys會鼓勵你使用std::copy代替:
std::copy(mystring.begin(), mystring.end(), buffer);
但是這確實沒什麼好處。如果你需要空終止使用std::string::c_str()
和其他人提供的各種字符串重複技術,但我通常會避免這種情況,只是查詢length
。特別是對於密碼學,你只是知道有人會試圖通過推入空值來破解它,並且使用std::string::data()
來阻止你對字符串中潛在的位進行懶惰的假設。
如果你只是需要讀取數據。
encrypt(str.data(),str.size());
如果您需要將數據的讀/寫副本放入矢量中, (不要動態分配空間,這是矢量的工作)。
std::vector<byte> source(str.begin(),str.end());
encrypt(&source[0],source.size());
當然,我們都假設字節是char!
我不認爲你想使用你在那裏的C#代碼。它們提供System.Text.Encoding.ASCII(也UTF-*)
string str = "some text;
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
你的問題是忽略C#中的編碼不是你的C++代碼
顯然這是關於C++幹。我修復了輸入錯誤 – 2009-02-02 21:46:55
是的,你是對的,謝謝 – Vic 2009-02-02 22:24:35