Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

StringOf


Страницы:   1 2

Gu ©   (2011-12-03 19:42:00) 

StringOf = массив байт в строку. А как строку в массив байт?

B:TBytes;s:string;
..
s:=TBytes(b);

компилит норм но показывет только 1 символ


абизяна   (2011-12-04 14:50:00) [1]


> Юрий_   (04.12.11 10:48) [28]
>
> var B: Byte;
>
> Какое значение надо присвоить переменной B, чтобы стало
> истинным выражение:
>
> Ord(B) = '?';
>
> Я не Мастер, я правда не понимаю. Объясните

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


sniknik   (2011-12-04 13:30:00) [2]

> Мне вопрос был понятен с самого начала.
малацца

> В вопросе фактически обозначена версия Delphi.
да ну? я вот пишу на D7, и с чего мне знать, что StringOf это не функция самописка, а "фактически  обозначает версию и Unicod"?

p.s. "претензии" у меня к тебе не потому что ты чего то не знаешь, а потому что начал с "наездов".
p.p.s. не у всех все также как у тебя... в смысле у спрашивающих тоже, и именно поэтому нужно приводить информацию, а не надеяться на "умолчания".


DVM   (2011-12-04 11:45:00) [3]


> sniknik ©   (04.12.11 11:04) [29]


> а почему ты начал отвечать после "раскрытия" смысла вопроса,
>  а не "до" когда любой вопрос на доп.инфу авторами воспринимается
> как личное оскорбление.
> и почему потом начал не с объяснений автору того, что его
> "понимание" не совсем правильно, а с придирок отвечающим?
>  которые кстати подготовили для тебя это самое "раскрытие".
>

Мне вопрос был понятен с самого начала. Я не мониторю все вопросы в реальном времени, чтоб отвечать немедленно и первым.

> StringOf = массив байт в строку. А как строку в массив байт?

Чего тут можно не понимать то? Тут не написано про Ansi строки, это все догадки. Наоборот тут обозначены Unicode строки. В вопросе фактически обозначена версия Delphi.


sniknik   (2011-12-04 11:07:00) [4]

> Какое значение надо присвоить переменной B, чтобы стало истинным выражение:
> Ord(B) = '?';
посмотри сам
Ord(B) = Ord('?');

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


sniknik   (2011-12-04 11:04:00) [5]

> Да не, просто надо ещё и TEncoding передавать, тогда проблем не должно быть.
UTF8 это транспортная кодировка, и универсальная с учетом страницы, это как раз аналог юникода... т.е.  того во что тут конвертируется. если бы он работал в нем, то проблем бы и так не было. но он то ее пытается "вернуть" ее обратно, в состояние массива байт.
т.е. проблемы будут. обязательно будут, если раскодировать из любой юникодной/аналога в других условиях, с другой локалью, с отсутствующими в ней символами.

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

DVM ©   (04.12.11 00:01) [22]
> Не хотел я цепляться, но ты сам заставляешь. Вот ты пишешь:
вот тоже, типа не хотел, но придется...
а почему ты начал отвечать после "раскрытия" смысла вопроса, а не "до" когда любой вопрос на доп.инфу авторами воспринимается как личное оскорбление.
и почему потом начал не с объяснений автору того, что его "понимание" не совсем правильно, а с придирок отвечающим? которые кстати подготовили для тебя это самое "раскрытие".


Юрий_   (2011-12-04 10:48:00) [6]


> игра в "дурочку"? возьми ord() от него, да посмотри. или
> в дебаге... средств хватает.


var B: Byte;

Какое значение надо присвоить переменной B, чтобы стало истинным выражение:

Ord(B) = '?';

Я не Мастер, я правда не понимаю. Объясните


Ega23   (2011-12-04 02:41:00) [7]


> Не, ну если все происходит на одном компьютере и в течение
> работы программы не меняется локаль то все будет туда сюда
> конвертироваться однозначно.


ключевое слово "если", согласись...

> Но для передачи данных TBytes по сети такой метод не походит
> разумеется.
> Точнее подходит но кодировку надо брать UTF8 а не Default


Да не, просто надо ещё и TEncoding передавать, тогда проблем не должно быть.


DVM   (2011-12-04 01:25:00) [8]


> Ega23 ©   (04.12.11 01:14) [24]


> Поэтому однозначного решения [6] нет, т.к. мы не можем однозначно
> утверждать, какой  default system locale был выбран изначально.
>

Не, ну если все происходит на одном компьютере и в течение работы программы не меняется локаль то все будет туда сюда конвертироваться однозначно.  Default кодировка она всегда однобайтная для Windows:
class function TEncoding.GetDefault: TEncoding;
begin
{$IFDEF MSWINDOWS}
 Result := ANSI;
end;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
 Result := UTF8;
end;
{$ENDIF POSIX}
Но для передачи данных TBytes по сети такой метод не походит разумеется.
Точнее подходит но кодировку надо брать UTF8 а не Default


Германн   (2011-12-04 01:23:00) [9]

Ну и ещё.
TBytes - это не массив байт. Это "тип" Дельфи.
Это я к тому, что если не умеешь задать правильно вопрос, то не чирикай!


Ega23   (2011-12-04 01:14:00) [10]


> но с поправкой на то, что массив байт можно трактовать неоднозначно,
>  может этот массив это анси строка, а может UTF8 или Unicode.
>


Вот именно.
Производная от f(x) = 2x + 5 будет равна 2 для любого x
Но количество первообразных от F(x) = 2 будет бесконечно. Одна из них - таки да, будет f(x) = 2x + 5
Поэтому однозначногорешения [6] нет, т.к. мы не можем однозначно утверждать, какой  default system locale был выбран изначально.


Германн   (2011-12-04 00:14:00) [11]


> Gu   (03.12.11 20:31) [6]
>
> если не знаете ответа нечего писать.
> для особо непонятливых:
>

Если не умеете задавать вопросы, то нечего писать.

Надо было сразу сказать для чего вам нужны были преобразования String->TBytes и TBytes->String. Ибо такие преобразования в Д2009+ весьма неоднозначные.


DVM   (2011-12-04 00:01:00) [12]


> sniknik ©   (03.12.11 23:38) [20]

Не хотел я цепляться, но ты сам заставляешь. Вот ты пишешь:


> как раз после того как стало понятно, что автор говорит
> про юникод "знак равенства" был скинут. ну и т.д.

Т.е в посте [5], допустим, ты считаешь, что автор вопроса работает с Ansi строкой. В посте [5] было сказано:


> чего??? еще раз по ручки, начни с описания чего делает,
> как ты понимаешь, StringOf... и что есть для нее "обратная"?
>  только не функцией, а описанием действия.

Далее ты добавил:


> > // Converts a byte array into a Unicode string using the
> default system locale.
> "обратная" в общем случае невозможна. получишь набор из
> вопросов.
>
> чего не понятно?

Но как раз для Ansi строки лежащей в массиве TBytes конвертация ее в UnicodeString с помощью StringOf не приведет к потере данных и обратная конвертация также всегда возможна.


DVM   (2011-12-03 23:50:00) [13]


> sniknik ©   (03.12.11 23:38) [20]


> как раз после того как стало понятно, что автор говорит
> про юникод

Это ж было понятно с самого начала. В D2006-2007 насколько мне известно типа TBytes нет. Появился он в D2009. Строка у него string - значит Unicode. Функции StringOf тоже нет в < D2009.


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

Я правда не понял. Я ясность пытаюсь внести в вопрос.


sniknik   (2011-12-03 23:38:00) [14]

> то нельзя все же так ставить знак равенства между строкой и массивом байт.
как раз после того как стало понятно, что автор говорит про юникод "знак равенства" был скинут. ну и т.д.
и тут же пошли какие-то претензии  к ответившим... какие то инсенуации в виде доп вопросов... игра в "дурочку"... странно все это.
вот скажи ты когда переспрашивал

DVM ©   (03.12.11 21:59) [11]
> Строку в массив байт невозможно?

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


DVM   (2011-12-03 23:27:00) [15]

Короче, правильный ответ на [0] - это 2 функции:

TEncoding.тут нужная кодировка.GetString
TEncoding.тут нужная кодировка.GetBytes


DVM   (2011-12-03 23:24:00) [16]


> не строку в массив, и зачем это, если одно и то же

Если речь об юникодных строках, то нельзя все же так ставить знак равенства между строкой и массивом байт. Во-первых, все же, в строке первый элемент имеет индекс 1, а в массиве 0, во вторых S[I] - это не байт с индексом I, а элемент массива Char с таким индексом. Length для массива байт вернет длину в байтах, для строки в символах, для анси строки в байтах, для UTF8 строки я вообще затрудняюсь ответить что она вернет (по идее в байтах, но их количество не равно количеству символов). Ну есть и другие отличия. Ну это вы и без меня знаете.


> Юникод-строку в анси-строку.

я наверное тупой, но насколько я понял ему нужны были 2 функции, одна строку в массив TBytes (именно в него, а никакой другой массив) и вторая из TBytes обратно в строку. И то и другое вполне себе возможно, но с поправкой на то, что массив байт можно трактовать неоднозначно, может этот массив это анси строка, а может UTF8 или Unicode. Но если мы знаем, что четко всегда используем Unicode то перевести можно и туда и обратно без проблем. То же можно сказать про любую другую кодировку.

Найденная им функция
function StringOf(const Bytes: TBytes): UnicodeString;
begin
 if Assigned(Bytes) then
   Result := TEncoding.Default.GetString(Bytes, Low(Bytes), High(Bytes) + 1)
 else
   Result := '';
end;

как видно использует дефолтную кодировку Multibyte что приведет к потере возможно символов, если изначально в TBytes находились Unicode символы.


sniknik   (2011-12-03 23:18:00) [17]

> очень интересно,
врешь.  не интересно. просто решил "пальцы погнуть"

> как вы собираетесь получить набор из вопросов в массиве байтов?
не собираюсь вообще... само получится. предупреждаю.

> Какой байт есть "вопрос"?
игра в "дурочку"? возьми ord() от него, да посмотри. или в дебаге... средств хватает.


Юрий_   (2011-12-03 23:08:00) [18]


> "обратная" в общем случае невозможна. получишь набор из
> вопросов.
>


очень интересно, как вы собираетесь получить набор из вопросов в массиве байтов? Какой байт есть "вопрос"?


Ega23   (2011-12-03 23:01:00) [19]


> Строку в массив байт невозможно?


Юникод-строку в анси-строку.


sniknik   (2011-12-03 23:00:00) [20]

> Строку в массив байт невозможно?
не строку в массив, и зачем это, если одно и то же, а "обратное", Converts из юникода в исходный массив.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо