Получите байты от станд.:: строка в C++

Если вы интерпретируете это как «сортировать по каждому сегменту цифр», тогда вы будете обрабатывать ваш пример ввода выше:

input.map{ |ver| ver.split(%r{[^\d]+}).map(&:to_i) }.zip(input).sort.map(&:last)
=> ["9_0", "9_1", "10_0b3", "10_0b12"]

То есть,

  • для каждого значения, например 10_0b3
  • , разделенного на любую длину нецифровых символов, например ["10","0","3"]
  • отбрасывает каждый разрядный сегмент на целое число, например [10,0,3]
  • zip с исходным входом, дает [[[10, 0, 12], "10_0b12"], [[10, 0, 3], "10_0b3"], [[9, 0], "9_0"], [[9, 1], "9_1"]]
  • sort, в силу [10,0,3] < [10,0,12]
  • получить последнее значение каждого элемента, которое является исходным входным значением, которое соответствует каждому обрабатываемому сортируемому значению

. Теперь предоставлено, это все еще довольно обычай - номера версий, такие же простые, как «9_0a» против «9_0b», не будут обрабатываться, обе будут отображаться [9,0] - так что вам, возможно, придется еще больше подстроить его, но, надеюсь, это приведет вас к жизнеспособному пути.

EDIT: Пример ввода выше изменен, поэтому я изменил регулярное выражение, чтобы убедиться, что цифра -мачание жадно, и с этим он все еще держится:

irb(main):018:0> input = ['10.0.0b12', '10.0.0b3', '9.0.10', '9.0.3']
=> ["10.0.0b12", "10.0.0b3", "9.0.10", "9.0.3"]
irb(main):025:0> input.map{ |ver| ver.split(%r{[^\d]+}).map(&:to_i) }.zip(input).sort.map(&:last)
=> ["9.0.3", "9.0.10", "10.0.0b3", "10.0.0b12"]
19
задан Chris Young 3 February 2009 в 05:53
поделиться

7 ответов

Если Вам просто будет нужен доступ только для чтения, то c_str() сделает это:

char const *c = myString.c_str();

при необходимости в доступе для чтения-записи, затем можно скопировать строку в вектор. векторы управляют динамической памятью для Вас. Вы не должны смешивать с выделением/освобождением затем:

std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
30
ответ дан 29 November 2019 в 06:54
поделиться

std::string::data , казалось бы, был бы достаточным и самым эффективным. Если Вы хотите иметь память неконстанты для управления (странный для шифрования), можно скопировать данные в буфер с помощью memcpy:

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

фанаты STL поощрили бы Вас использовать станд.:: копия вместо этого:

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

, но действительно нет большой части позитивного аспекта к этому. Если бы Вам нужно пустое использование завершения std::string::c_str(), и различные строковые другие методов дублирования обеспечили, но я обычно избегал бы, чтобы и просто запросили для length. Особенно с криптографией Вы просто знаете, что кто-то собирается попытаться повредиться, она пиханием аннулирует в к нему, и использование std::string::data() обескураживает Вас от ленивого создания предположений о базовых битах в строке.

24
ответ дан 29 November 2019 в 06:54
поделиться

От станд.:: строка можно использовать c_ptr () метод, если Вы хотите достигнуть буферный указатель char_t.

похоже, что Вы просто хотите, копируют символы строки в новый буфер. Я просто использовал бы станд.:: строка:: копия функция:

length = str.copy( buffer, str.size() );
1
ответ дан 29 November 2019 в 06:54
поделиться

Обычно, функции шифрования берут

encrypt(const void *ptr, size_t bufferSize);

как аргументы. Можно передать c_str и длину непосредственно:

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

Таким образом, дополнительное место выделено или потрачено впустую.

4
ответ дан 29 November 2019 в 06:54
поделиться

Если просто необходимо считать данные.

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

, Если Вам нужна копия чтения-записи данных, помещает его в вектор. (Дон; t динамично выделяют место, это - задание вектора).

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

, Конечно, мы все предполагаем, что байт является символом!!!

1
ответ дан 29 November 2019 в 06:54
поделиться

Если это - просто ванильный C, то:

strcpy(buffer, text.c_str());

Предположение, что буфер выделяется и достаточно большой для содержания содержания 'текста', который является предположением в исходном коде.

, Если шифруют () берет 'символ константы *', затем можно использовать

encrypt(text.c_str())

, и Вы не должны копировать строку.

0
ответ дан 29 November 2019 в 06:54
поделиться

Я не думаю, что Вы хотите использовать c# код, который Вы имеете там. Они обеспечивают Систему. Текст. Кодирование. ASCII (также UTF -*)

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

Ваши проблемы останавливает от игнорирования кодирования в c# не Ваш код C++

-7
ответ дан 29 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: