2009-02-02 42 views
15

Tôi đang làm việc trong một dự án không được quản lý C++.Nhận byte từ std :: string in C++

Tôi cần biết làm thế nào tôi có thể lấy một chuỗi như thế này "một số dữ liệu để mã hóa" và nhận được một mảng byte [] mà tôi sẽ sử dụng làm nguồn cho Mã hóa.

Trong C# Tôi làm

for (int i = 0; i < text.Length; i++) 
    buffer[i] = (byte)text[i]; 

Những gì tôi cần biết là làm thế nào để làm điều tương tự nhưng sử dụng không được quản lý C++.

Cảm ơn!

+0

rõ ràng đây là về C++. tôi đã sửa lỗi chính tả –

+0

vâng bạn đúng, cảm ơn – Vic

Trả lời

24

Nếu bạn chỉ cần truy cập read-only, sau đó c_str() sẽ làm điều đó:

char const *c = myString.c_str(); 

Nếu bạn cần đọc/ghi truy cập, sau đó bạn có thể sao chép chuỗi thành một vector. vectơ quản lý bộ nhớ động cho bạn. Bạn không cần phải gây rối với phân bổ/deallocation sau đó:

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

Nếu anh ta muốn một mảng byte, anh ta có cần chấm dứt '\ 0' không? Trong trường hợp đó bạn có thể sử dụng dữ liệu() cho chỉ đọc. –

+0

Tôi không chắc liệu anh ấy có cần \ 0 hay không. Nếu bây giờ anh ta không biết rằng anh ta có thể sử dụng .data(). cảm ơn vì đã bình luận về điều đó, Martin. –

+1

Câu trả lời này có vẻ đúng và có thể hoạt động nhưng giả sử lưu trữ dữ liệu cho một véc tơ char là tiếp giáp và sẽ không thay đổi là nguy hiểm. – Mark

1

Từ std :: string, bạn có thể sử dụng phương thức c_ptr() nếu bạn muốn lấy con trỏ đệm char_t.

Dường như bạn chỉ muốn sao chép các ký tự của chuỗi vào bộ đệm mới. Tôi chỉ đơn giản sẽ sử dụng std::string::copy chức năng:

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

Một số triển khai của std :: string có thể sử dụng tính tham chiếu, do đó, một bản sao sẽ không nhất thiết dẫn đến các byte mới sẽ an toàn để ghi đè lên. –

0

Nếu đây là chỉ đơn giản vani C, sau đó:

strcpy(buffer, text.c_str()); 

Giả sử đệm được phân bổ và đủ lớn để chứa được nội dung 'text', mà là giả định trong mã ban đầu của bạn.

Nếu mã hóa() mất một 'const char *' sau đó bạn có thể sử dụng

encrypt(text.c_str()) 

và bạn không cần phải sao chép chuỗi.

3

Thông thường, chức năng mã hóa mất

encrypt(const void *ptr, size_t bufferSize); 

như các đối số. Bạn có thể vượt qua c_str và chiều dài trực tiếp:

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

Bằng cách này, thêm không gian được phân bổ hoặc lãng phí.

+0

Nếu bạn đang đi qua một con trỏ và chiều dài thì bạn nên sử dụng dữ liệu() chứ không phải là c_str() để cho biết nó không được sử dụng như một chuỗi. –

18

std::string::data dường như đủ và hiệu quả nhất. Nếu bạn muốn có bộ nhớ non-const để thao tác (xa lạ đối với mã hóa), bạn có thể sao chép dữ liệu đến một bộ đệm sử dụng memcpy:

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

fanboy STL sẽ khuyến khích bạn sử dụng std::copy thay vì:

std::copy(mystring.begin(), mystring.end(), buffer); 

nhưng thực sự không có nhiều bất lợi cho điều này. Nếu bạn cần sử dụng kết thúc null std::string::c_str() và các kỹ thuật sao chép chuỗi khác nhau mà người khác đã cung cấp, nhưng tôi thường tránh điều đó và chỉ truy vấn length.Đặc biệt với mật mã, bạn chỉ biết ai đó sẽ cố gắng phá vỡ nó bằng cách đẩy null vào nó, và sử dụng std::string::data() không khuyến khích bạn từ lười biếng đưa ra các giả định về các bit cơ bản trong chuỗi.

1

Nếu bạn chỉ cần đọc dữ liệu.

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

Nếu bạn cần bản sao đọc/ghi dữ liệu đưa nó vào vec-tơ. (Don; t tự động phân bổ không gian đó là công việc của vector).

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

Tất nhiên chúng ta đều giả định rằng byte là char!

-6

Tôi không nghĩ bạn muốn sử dụng mã C# mà bạn có. Họ cung cấp System.Text.Encoding.ASCII (còn UTF- *)

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

vấn đề của mình xuất phát từ bỏ qua mã hóa trong C# không c của bạn ++ mã