Linux с string type

ИТ База знаний

Курс по Asterisk

Полезно

— Узнать IP — адрес компьютера в интернете

— Онлайн генератор устойчивых паролей

— Онлайн калькулятор подсетей

— Калькулятор инсталляции IP — АТС Asterisk

— Руководство администратора FreePBX на русском языке

— Руководство администратора Cisco UCM/CME на русском языке

— Руководство администратора по Linux/Unix

Серверные решения

Телефония

FreePBX и Asterisk

Настройка программных телефонов

Корпоративные сети

Протоколы и стандарты

Как использовать команду Strings в Linux

Нужно просмотреть текст внутри двоичного файла или файла данных? Команда Linux strings извлечет и выведет на терминал биты текста, которые называются «строками».

Онлайн курс по Linux

Мы собрали концентрат самых востребованных знаний, которые позволят тебе начать карьеру администратора Linux, расширить текущие знания и сделать уверенный шаг к DevOps

Linux полон команд, которые могут выглядеть как решения в поисках проблем. Команда strings одна из них. Так, зачем же она нужна? Есть ли похожая команда, которая перечисляет строки для печати из двоичного файла?

Давайте вернемся назад. Двоичные файлы, такие как программные файлы, могут содержать строки читаемого человеком текста. Но как мы их видим? Если использовать cat или less , то, скорее всего, зависнет окно терминала. Программы, предназначенные для работы с текстовыми файлами, не могу обрабатывать исполняемые файлы, содержащие непечатаемые символы.

Большая часть данных в двоичном файле нечитабельна и не могут быть выведены в окно терминала каким-либо образом, так как нет знаков или стандартных символов для представления двоичных значений, которые не соответствуют буквенно-цифровым символам, знакам пунктуации или пробелам. В совокупности они называются «печатаемыми» символами. Остальные — «непечатаемые» символы.

Поэтому попытка просмотра или поиска текстовых строк в двоичном файле или файле данных является проблемой. И вот здесь на помощь спешит strings . Он извлекает строки печатаемых символов из файлов, чтобы другие команды могли использовать эти строки без необходимости контактировать с непечатаемыми символами.

Использование команды strings

На самом деле нет ничего сложного в этой команде: просто передаем команде название файла.

Как пример, мы попробуем просмотреть содержимое исполняемого файла jibber с помощью strings .

На скриншоте ниже список строк, извлечённых из указанного файла:

Установка минимальной длины строки

По умолчанию, команда strings ищет строки, содержащие четыре и более символов. Чтобы изменить значение по умолчанию используется ключ –n .

Имейте ввиду, что чем короче минимальная длина, тем больше шансов получить на выводе бесполезного материала.

Некоторые двоичные значения имеют то же числовое значение, что и значение, представляющее печатаемый символ. Если два из этих числовых значений находятся рядом в файле, а минимальная длина, равна двум, эти байты будут отображаться как строки.

Чтобы установить длину строки равной двум, используйте следующую команду:

Теперь у нас на выводе есть строки, длина который равна двум и более символам. Учтите, что пробел тоже считается печатаемым символом.

Ограничение вывода команды strings командой less

Чтобы ограничить объем выведенной информации вывод команды strings можно передать команде less , а затем прокруткой просматривать всю информацию:

Теперь мы видим список, выводимый командой less , где начало списка отображено первым:

Использование strings с файлами объектов

Обычно исходный код программ компилируется в файлы объектов. Они в свою очередь связаны с файлами библиотек, чтобы создать исполняемый файл. У нас есть файл объектов jibber , давайте посмотрим, что в нем:

Данные выводятся в таблице по 8 колонок, каждая из строк которой заканчивается на букву “H” . В данном примере у нас SQL запрос.

Но если прокрутить ниже, то можно заметить, что форматирование не относится ко всему файлу.

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

Поиск в конкретной области файла

Скомпилированные программы имеют различные области, которые используются для хранения текста. По умолчанию, strings ищет текст во всем файле. Это так же, как если бы вы использовали параметр -a (all). Для поиска строк только в инициализированных, загруженных разделах данных в файле используйте параметр -d (data).

Если нет особой причины, то вполне можно обойтись значением по умолчанию.

Вывод номера строки

Иногда бывает необходимо узнать точное смещение, расположение строки в файле. В этом нам поможет ключ –o (offset).

В данном случае номера строки показаны в восьмеричной системе.

Читайте также:  Logitech anywhere mx драйвер windows 10

Для получения значений в других системах исчисления, достаточно использовать опцию –t , а затем передать нужный ключ: d (десятичная система), x (шестнадцатеричная) или o (восьмеричная). Опция –t с ключом o равнозначна запуску команды strings с ключом –o .

Теперь номера строк показаны в десятичной системе:

А тут в шестнадцатеричной:

Вывод управляющих символов

Команда strings принимает знаки табуляции и пробела, как часть строки, игнорируя при этом символ начала новой строки — /r или возврата каретки — /r . Чтобы включить их отображение нужно добавить ключ –w .

Ниже мы видим пустую строку. Это результат работы управляющих символов: либо символа новой строки, либо символ возврата каретки.

Мы не ограничены только файлами

Мы можем использовать строки с любым, что есть или может создать поток байтов.

С помощью этой команды мы можем просмотреть содержимое оперативной памяти (RAM) нашего компьютера. Нам нужно использовать >sudo, потому что мы получаем доступ /dev/mem . Это символьного файл устройства, в котором хранится изображение оперативной памяти компьютера.

В списке не все содержимое оперативной памяти, а лишь то, что команда strings смогла извлечь.

Поиск нескольких файлов сразу

Маски можно использовать для выбора групп файлов для поиска. Символ * обозначает нуль и больше символов, а символ «?» означает любой отдельный символ. Можно также указать в командной строке множество имен файлов.

Мы будем использовать маску для поиска всех исполняемых файлов в каталоге /bin . Поскольку список будет содержать результаты из многих файлов, будет использоваться параметр -f (имя файла). Имя файла будет напечатано в начале каждой строки. Затем можно просмотреть файл, в котором была найдена данная строка.

Затем передадим результаты через grep и выведем строки, содержащие слово «Copyright»:

Мы получаем упорядоченный список с об авторских правах каждого файла в каталоге /bin , с именем файла в начале каждой строки.

Команда strings распутана

Команда strings – это не какая-то тайная команда. Это обычная команда Linux. Он делает выполняет конкретные задачи и делает это очень хорошо. Это еще один из преимуществ Linux, и действительно мощных в сочетании с другими командами. Когда вы видите, как он может оперировать двоичными файлами и другими инструментами, такими как grep, начинаете по-настоящему ценить функциональность этой слегка непонятной команды.

Онлайн курс по Linux

Мы собрали концентрат самых востребованных знаний, которые позволят тебе начать карьеру администратора Linux, расширить текущие знания и сделать уверенный шаг к DevOps

Источник

Кроссплатформенная работа со строками на C++

Не так давно озадачился вопросом кроссплатформенной работы со строками в приложениях c++. Задача была, грубо говоря, поставлена как регистронезависимый поиск подстроки в любой кодировке на любой платформе.

Итак, первое с чем пришлось понять — что со строками в Линуксе нужно работать в кодировке UTF-8 и в типе std::string, а в Windows строки должны быть в UTF-16LE (тип std::wstring). Почему? Потому что это by design операционных систем. Хранить строки в std::wstring в Линуксе крайне накладно, поскольку один символ wchar_t занимает 4 байта (в Windows — 2 байта), а работать std::string в Windows нужно было во времена Windows 98. Для работы со строками определяем свой платформонезависимый тип:

Второе — задача преобразование текста из любой кодировки в тип mstring. Тут вариантов не так много. Первый вариант — использование std::locale и прочих соответствующих стандартных вещей. Сразу бросилось в глаза необходимость поиска для каждого charset’a соотвествующей ему локали (типа кодировке «windows-1251» соответствует локаль Russian_Russia.1251 и т.п.). В стандартной библиотеке такая таблица не нашлась (может плохо искал?), искать примочку для списка локалей не захотелось. Да и вообще, работа с локалалями в C++ вещь очень неочевидная, на мой взгляд. На форумах советовали использовать библиотеки libiconv или icu. libiconv выглядел очень легко и просто, с задачей перекодировки из любого charset’a в mstring справлялся отлично, но когда дело дошло до преобразования mstring в нижний регистр меня постиг fail. Оказалось libiconv делать это не умеет, а преобразовать строку utf8 в нижний регистр просто и красиво в Линуксе у меня не получилось. Итак, выбор пал на icu, который с честью решил все поставленные задачи (конвертация и перевод в нижний регистр). Процедура платформонезависимой перекодировки с использованием библиотеки icu выглядит примерно так:

Вопросы работы с Юникодом в Windows описывать не буду — все там достаточно хорошо документировано.

Источник

gcc не понимает тип string

помогите разобраться в файле есть строки

при попытке компиляции gcc выдает что типа string он не знает можно конечно заменить string на char * но интересен сам факт может кто нить знает как режить проблемму

Re: gcc не понимает тип string

А где сказано, что тип string существует?

gcc не понимает тип string

да точно типа string не существует так написано man string

тогда кто нить занет структуры стринг что бы ее определить

шутники однако «не существует» 🙂

Re: gcc не понимает тип string

char*, gcc, std::string, g++,

Re: gcc не понимает тип string

gcc не понимает тип string

я не понял последнего сообщения это типа using namespace std;

Re: gcc не понимает тип string

include вообще не понимает все перепробовал ни один пример не работает

бросил string написал char str[255]

Читайте также:  What is customizing windows

Re: re

>gcc не понимает тип string

Re: re

Re: gcc не понимает тип string

может быть имеет смысл спросить на какой языке пишет rh9?

Re: gcc не понимает тип string

>gcc не понимает тип string

Зато g++ понимает. gcc — для Си, g++ — для С++

Re: re

потому что руки не из жопы, как тут у некоторых

Re: re

А ты не gcc а g++ дёргай — тогда сразу волшебным образом string появится.

Re: re

Re: re

1. Не оператором а именем
2. return 0 в main лишнее
3. Нахрена тебе компилить в объектник, можно сразу в бинарь

а так все верно

Re: re

Если уж быть последовательным — cout никак не оператор, а стандартный поток вывода. Оператор же напр. ★★★★★ ( 04.11.05 16:32:25 )

using namespace . разрешает, описался. моно писать usin std::cout; напр. Тоже работает не только для операторов;-)

Re: re

> [не указывать return — можно, но не желательно]

смотря в каком языке. в С++ обязательно, в Си — нет, что-то функция вернет, а вот что неизвестно 🙂

Re: re

> Не лишнее, так как :
> int main(int argc, char* argv[])
> [не указывать return — можно, но не желательно]

Не надо распространять заблуждения.
Стандарт C++ (в отличие от C) _допускает_ выход из main()
без exit() и return, причем эта ситуация явно описана:

If control reaches the end of main without encountering a return
statement, the effect is that of executing return 0.

Нет тут ничего нежелательного.

Re: re

Я не сказал что нельзя, и не сказал что не_желательно для компилятора — ему пофиг. в int main(int argc, char* argv[]) стоит инт, поэтому мне кажецца безпочвенным. З.Ы.: К этому можно есчо и написание в коде коментариев приплести.

Да накрутил немножко. 2aton Погорячился, 3 дня не сплю. Извени если обидел.

Источник

C++ String class Examples and Tutorial

C++ may use the C char variable type and string functions but they rely on a null termination and proper memory allocation to hold the string. The ANSI C++ GNU string classes included in the C++ standard library attempt to simplify string manipulation by automating much of the memory allocation and management. Included in this tutorial are examples of the string classes included with the GNU g++ compiler on Linux. This string class is cross platform and included with both Unix/Linux ANSI and Microsoft Visual C++ compilers. Because it is standard with cross platform availability, the «string» class is preferred over the Microsoft MFC «String» class.

Related YoLinux Tutorials:

Simple example of a program using string class and comparison with C char:

C++ String Class: C character:

Compile: g++ stringtest.cpp -o stringtest
Run: ./stringtest
Results for both examples:

The C and C++ methods of managing a character data type are both valid but we will see that the C++ string class offers more functionality and convenience. The STL string does not require memory to be pre-allocated nor allocated manually. The STL string class also provides many methods of string assignment.

Find: (also rfind(), find_first_of(), find_last_of(), find_first_not_of(), find_last_not_of())

  • Val.find(const string& argument)
    Find first occurence of argument within string Val
  • find(const string& argument, size_type index)
    Find first occurence of argument within string Val starting search from position index.
  • find(const char* argument)
  • find(const char* argument, size_type index)
  • find(const char* argument, size_type index, size_type length)
    Find first occurence of argument within string Val starting search from position index and search for length number of characters.

STL C++ string functions:

Assuming declaration: string Var;

The full use of the C standard library is available for use by utilizing the ".c_str" function return of the string class.

Compile and run:

In memory I/O string processing used as a data type conversion. This can also be used to make use of formatting of output in memory.

This is used to make use of reading and parsing a string in memory. It will also allow data type conversion from a string to the type read.

The string function std::to_string() is part of the C++ 11 standard and converts integer and floating point values to a string. The g++ compiler will require the compile flag -std=c++11 to support C++ 11.

Function/Operation Description
Var = string2
Var.assign(«string-to-assign«)
Assignment of value to string (operator=). When assigning a C «char» data type, first check if NULL to avoid failure/crash.
i.e.: if( szVar ) sVar.assign( szVar );
where szVar is a C «char *» data type and sVar is of type «string».
Var.swap(string2)
swap(string1,string2)
Swap with value held in string2.
Function swap will exchange contents of two string class variables.
Var += string2
Var.append()
Var.push_back()
Append string/characters to the end of the string.
For string Var("abc"); the call to Var.append("xyz") will result in the string «abcxyz».
Var.insert(size_t position, string)
Var.insert(size_t position, char *)
Var.insert(size_t position, string, size_t pos1, size_t len)
Var.insert(size_t position, char *, size_t pos1, size_t len)
Insert characters.
position: insert before this character position. If 0 then insert before the string
pos1: position of the first char of the string being inserted
len: length of string to be inserted
Var.erase()
Var = «»
Clear string variable. No arguments necessary.
+ Concatenate
==, !=, , >= Compare strings.
Var.compare(string)
Var.compare( size_t pos1, size_t len, string ) const;
Var.compare( size_t pos1, size_t len1, const string, size_t pos2, size_t len2 ) const;
Compare strings. Returns int:
  • 0: if equal.
  • -1: Not equal. 1st non matching character in Var is less in value based on ASCII table than in compare string.
  • +1: Not equal. 1st non matching character is greater in value based on ASCII table.

Where string is another STL string or null terminated C string.

Var.length() Return memory allocated to storage of the string. No arguments necessary. The methods length(), size() and capacity() all return the same value.
Var.size() Return length of string. No arguments necessary.
Var.capacity() Return length of string + 1. Red Hat 7.x. Red Hat 8.0+ returns the number of characters without the «+1». Number of characters that can be held without re-allocation.
No arguments necessary.
Var.max_size() Returns a very large number. No arguments necessary.
Var.empty() Returns 1 if an empty string.
Returns 0 if not empty.
>
getline()
Input stream
Var.c_str() Returns C string pointer. C char string is null terminated. Do not free memory using this pointer!
Var.data() Returns C string pointer. C char string is NOT null terminated. Do not free memory using this pointer!
Var[]
Var.at(integer)
Access individual characters. Return single character at specified position (integer).
For Var("abc");, Var[2] returns «c».
Var.copy(char *str,size_t len, size_t index) str: allocated char storage to which the copy ismade
len: the number of characters to copy
index: the starting place in the string from which to start the copy. Counting starts from 0
returns the number of characters copied
Var.find(string)
Var.find(string, positionFirstChar)
Var.find(string, positionFirstChar, len)
Find first occurance of string or substring. Returns int position of first occurance in string. Where len is the length of the sequence to search for.
Returns string::npos if not found.
i.e. if(Var.find("abc") == string::npos) cout

Iterator types:

  • string::traits_type
  • string::value_type
  • string::size_type
  • string::difference_type
  • string::reference
  • string::const_reference
  • string::pointer
  • string::const_pointer
  • string::iterator
  • string::const_iterator
  • string::reverse_iterator
  • string::const_reverse_iterator
  • string::npos

ANSI C++ string class and the C standard library:

Function Description
std::string to_string( int value ); Returns a string given an integer
std::string to_string( long long value ); Returns a string given a long long
std::string to_string( unsigned value ); Returns a string given an unsigned
std::string to_string( unsigned long value ); Returns a string given an unsigned long
std::string to_string( unsigned long long value ); Returns a string given an unsigned long long
std::string to_string( float value ); Returns a string given a float
std::string to_string( double value ); Returns a string given a double
std::string to_string( long double value ); Returns a string given an long double

Example:

Example of a program using many of the build-in functions of the string class:

Compile: g++ program.cpp

[Potential Pitfall] : In Red Hat Linux versions 7.x one could omit the "using namespace std;" statement. Use of this statement is good programming practice and is required in Red Hat 8.0.

[Potential Pitfall] : Red Hat 8.0 requires the reference to "#include ". Red Hat versions 7.x used "#include ". (Also fstream, . )

Code Snipets:

  • Read lines from standard input:

The first thing you will notice when using the C++ string class is that you can't de-reference any of the string class variables directly with GDB, ddd. One must create a helper routine (for older versions of gdb) or use string class funtions (newer versions of gdb) to print out the value of the string variable.

Compile program with symbolic code for the debugger: g++ -g testprog.cpp

Start gdb debugger: gdb ./a.out

With newer versions of gdb, one may use built-in string class functions:

  • The string class is NOT a native data type, it is an object class and thus can not be handled like the traditional pointer to variable in gdb.
  • One can pass strings by reference (i.e. argument declarations using (string& variable-name )), by value (string variable-name ), and by pointer (string *variable-name ).
  • When using a reference, one may mimic the protection of a variable that passing by value enables by using (const string& variable-name )
The C++ Standard Library: A Tutorial Reference
Nicolai M. Josuttis
ISBN #0201379260, Addison Wesley Longman

This book is the only book I have seen which covers string classes as implemented by current Linux distributions. It offers extensive coverage of the C++ string classes as well as fairly complete coverage of the C++ Standard Template Library (STL).

C++ How to Program
by Harvey M. Deitel, Paul J. Deitel
ISBN #0131857576, Prentice Hall

Fifth edition. The first edition of this book (and Professor Sheely at UTA) taught me to program C++. It is complete and covers all the nuances of the C++ language. It also has good code examples. Good for both learning and reference.

Источник

Читайте также:  Как узнать аптайм windows server
Оцените статью