Хранение двоичных данных в строках - идеологически неправильно? - PullRequest
0 голосов
/ 15 июля 2010

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

Например, тип AnsiString в Delphi.Этими строками удобно управлять, и можно подумать, что это хорошая идея - использовать их в качестве контейнера для двоичных данных, поскольку существуют некоторые эффективные операции по объединению, извлечению подстрок и т. Д.

Почему-то у меня сильное чувствоТо, что использование строкового типа, даже если оно является бинарно-безопасным, для хранения бинарных данных является идеологически неправильным, но я не могу найти веских аргументов для защиты этой позиции.

Конечно, в таких языках, как PHP, где использование массивов действительно добавляет слишком много накладных расходов (каждый элемент массива в PHP занимает около 50 байтов памяти из-за хэшированной природы массивов), у вас нет другого выбора, кроме как использовать строкив качестве контейнеров двоичных данных.Но что касается Delphi или C ++ (с его std :: string), я думаю, что хранить двоичные данные в строках (например, ключи шифрования или любой буфер двоичного протокола) неправильно, даже если у вас есть техническая возможность сделать это.

Что ты думаешь?Есть ли аргументы против хранения двоичных данных в строках?

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Строки предназначены для обработки текста, а не двоичных данных. Таким образом, некоторые реализации строк могут использовать определенные возможности и не сохранять данные в том виде, в котором вы их вводили (например, преобразования в Юникод).

EDIT: Чтобы уточнить, приведенный выше комментарий, я не говорил о каком-то конкретном языке, но тот факт, что определенные реализации строк (в языках, где строки , а не просто символьные массивы) внутренне хранят данные по-разному, поэтому даже если Вы создаете строку из байтового массива, внутренне она может быть сохранена как двухбайтовый массив. Кроме того, во многих языках строки являются неизменяемыми, что обычно не то, что вам нужно при работе с необработанными данными.

В любом случае, я не могу представить ни одного языка, который бы имел приличную реализацию строк, но не векторную реализацию. Почему бы не использовать это вместо своего контейнера?

EDIT: Правда, большинство языков не позволяют переопределять операторы для массивов / векторов, и для этого есть веские причины (но это совсем другое обсуждение). Но кроме этого, у вас должно быть все, что вам нужно, даже если оно содержит немного меньше синтаксического сахара.

1 голос
/ 15 июля 2010

Зависит от языка. Если он позволяет вам делать все, что вы можете, со строкой, например, с целым числом, почему бы не сохранить его в int? в противном случае, для конкатенации и любой другой утилиты может показаться, что это неправильно, но единственными вариантами могут быть строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...