2009-02-02 3 views
15

저는 C++ 비 관리 프로젝트에서 작업하고 있습니다.C++에서 std :: string의 바이트를 가져옵니다.

"암호화 할 일부 데이터"와 같은 문자열을 가져와 암호화 원본으로 사용할 바이트 [] 배열을 얻는 방법을 알아야합니다. C#에서

나는 내가 알아야 할 것은 동일하지만 사용하여 관리되지 않는 C++를 수행하는 방법이다
for (int i = 0; i < text.Length; i++) 
    buffer[i] = (byte)text[i]; 

을한다.

감사합니다.

+0

분명이 C에 관한 ++ 코드 ++ 아닌 C를 C#에서 인코딩을 무시에서 줄기. 나는 오타를 고쳤다 –

+0

네가 맞아, 고마워. – Vic

답변

24

그냥 읽기 전용 액세스해야하는 경우, 다음 c_str()는 그것을 할 것입니다 :

char const *c = myString.c_str(); 

당신이 읽기/쓰기 액세스를 필요로하는 경우에, 당신은 벡터로 문자열을 복사 할 수 있습니다. 벡터는 동적 메모리를 관리합니다. 그런 다음 할당/해제와 함께 엉망이없는 : 당신이 char_t 버퍼 포인터 얻으려면 당신이 c_ptr() 메소드를 사용할 수있는 표준 : : 문자열에서

std::vector<char> bytes(myString.begin(), myString.end()); 
bytes.push_back('\0'); 
char *c = &bytes[0]; 
+1

만약 그가 바이트 배열을 원한다면 그는 '\ 0'을 끝내야 할까? 어떤 경우에는 읽기 전용으로 data()를 사용할 수 있습니다. –

+0

그는 \ 0이 필요한지 확실하지 않았습니다. 그가하지 않으면 그는 이제 그는 .data()를 사용할 수 있음을 알고 있습니다. 그 말에 대해 고마워, 마틴. –

+1

이 답변은 정확하고 작동 할 수 있지만 char 문자 벡터에 대한 데이터 저장소가 연속적이며 변경되지 않는다고 가정하면 위험합니다. – Mark

1

합니다.

문자열의 문자를 새 버퍼로 복사하는 것처럼 보입니다. 이 그냥 일반 바닐라 다음 C 인 경우

length = str.copy(buffer, str.size()); 
+0

std :: string의 몇개의 구현은 참조 카운팅을 사용할 수 있기 (위해) 때문에, 카피가 반드시 새로운 바이트를 기입 할 필요는 없습니다. –

0

: 나는 단순히 std::string::copy 기능을 사용 할당되는 버퍼를 가정

strcpy(buffer, text.c_str()); 

충분히 큰 '텍스트'의 내용을 보유하는 원래 코드의 가정입니다. 암호화()가 'const를 숯불 *'를 걸리는 경우

당신은

encrypt(text.c_str()) 

을 사용할 수 있으며 문자열을 복사 할 필요가 없습니다.

3

는 일반적으로 암호화 함수는 인수로

encrypt(const void *ptr, size_t bufferSize); 

을. 직접 c_str과 length를 전달할 수 있습니다.

encrypt(strng.c_str(), strng.length()); 

이렇게하면 추가 공간이 할당되거나 낭비됩니다.

+0

포인터와 길이를 전달하는 경우 c_str() 대신 data()를 사용하여 문자열로 사용되지 않음을 나타내야합니다. –

18

std::string::data은 충분하고 효율적인 것처럼 보입니다.

unsigned char buffer[mystring.length()]; 
memcpy(buffer, mystring.data(), mystring.length()); 

STL의 장식품을 대신 std::copy를 사용하는 것이 좋습니다 것입니다 :

std::copy(mystring.begin(), mystring.end(), buffer); 
당신은 memcpy 사용하면 버퍼에 데이터를 복사 할 수 있습니다 (암호화를위한 이상) 조작 const가 아닌 메모리를 갖고 싶어

그러나 실제로 이것에 대한 많은 부분이 없습니다. 널 종료가 필요한 경우 std::string::c_str()과 다른 문자열 중복 기술을 사용하십시오. 그러나 일반적으로이를 피하고 length에 대한 쿼리 만하면됩니다.특히 암호화를 사용하면 누군가가 null을 사용하여이를 깨뜨리려고한다는 것을 알게되고 std::string::data()을 사용하면 문자열의 기본 비트에 대한 게으른 가정을하지 않게됩니다.

1

데이터를 읽는 것만으로 충분하다면.

encrypt(str.data(),str.size()); 

데이터의 읽기/쓰기 사본이 필요한 경우 벡터에 넣으십시오. (벡터의 작업 공간을 동적으로 할당하지 마라).

std::vector<byte> source(str.begin(),str.end()); 
encrypt(&source[0],source.size()); 

물론 우리는 모두 바이트가 char라고 가정합니다!

-6

나는 당신이 가지고있는 C# 코드를 사용하고 싶지 않다고 생각한다. 그들은 System.Text.Encoding.ASCII을 제공한다 (도 UTF-*)

string str = "some text; 
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str); 

문제는

관련 문제