Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];
ВнизStringOf Найти похожие ветки
← →
Gu (2011-12-03 19:42) [0]StringOf = массив байт в строку. А как строку в массив байт?
B:TBytes;s:string;
..
s:=TBytes(b);
компилит норм но показывет только 1 символ
← →
Gu (2011-12-03 19:43) [1]http://embarcadero.newsgroups.archived.at/public.delphi.rtl/200907/0907291663.html
тут есть один пример но он не фурычит
← →
Ega23 © (2011-12-03 19:44) [2]Строка и так уже массив байт.
← →
Gu (2011-12-03 19:50) [3]это понятно. только вопрос не об этом
← →
Gu (2011-12-03 19:54) [4]нужна функция обратная StringOf. Из string получить tbytes
← →
sniknik © (2011-12-03 20:22) [5]> это понятно. только вопрос не об этом
если бы было понятно, то вопроса бы не было.
строка и так уже массив байт. разница только в интерпретации... ну вот чтобы сменить, свое к ним отношение, домашнее задание 1000 раз повторить мантру - "это уже массив байт, это уже массив байт, ...".
> нужна функция обратная StringOf. Из string получить tbytes
чего??? еще раз по ручки, начни с описания чего делает, как ты понимаешь, StringOf... и что есть для нее "обратная"? только не функцией, а описанием действия.
← →
Gu (2011-12-03 20:31) [6]если не знаете ответа нечего писать.
для особо непонятливых:
есть функция
function StringOf(Bytes:TBytes):String;
// Converts a byte array into a Unicode string using the default system locale.
нужна обратная
function AntiStringOf(str:String):TBytes;
чего не понятно?
← →
sniknik © (2011-12-03 21:25) [7]> // Converts a byte array into a Unicode string using the default system locale.
"обратная" в общем случае невозможна. получишь набор из вопросов.
чего не понятно?
← →
Ega23 © (2011-12-03 21:53) [8]
> для особо непонятливых:
Для особо непонятливых: строка это массив символов (char). В Ansi-случае AnsiChar и Byte суть одно и то же.
В unicode-случае char и byte не одно и то же, размер Char более одного байта.
Соответственно, твоя функция // Converts a byte array into a Unicode string using the default system locale.
Обратное однозначное преобразование невозможно. Это как интеграл берёшь, с конце "плюс С" не просто так добавляется.
В простейшем случае:var
aStr: AnsiString;
wStr: string;
begin
wStr := string(aStr);
aStr := AnsiString(wStr);
end;
← →
Gu (2011-12-03 21:53) [9]нашел
b:=TEncoding.Unicode.GetBytes(s);
← →
DVM © (2011-12-03 21:55) [10]
> Gu (03.12.11 20:31) [6]
var
b: TBytes;
S, S1: AnsiString;
begin
S := "ПРИВЕТ!";
SetLength(B, Length(S));
Move(S[1], B[0], Length(S));
S1:=StringOf(B);
Caption := S1;
end;
← →
DVM © (2011-12-03 21:59) [11]
> Обратное однозначное преобразование невозможно.
Строку в массив байт невозможно?
Массив байт в строку то он уже нашел.
← →
Gu (2011-12-03 22:02) [12]во.
тот пример не работал потомучто тогда стринги еще ансями были :)
спасибо dvm, но мне нужно было для string в xe, решение уже нашел, выше см.
← →
DVM © (2011-12-03 22:10) [13]
> Gu (03.12.11 22:02) [12]
> тот пример не работал потомучто тогда стринги еще ансями
> были :)
"Тот пример" тоже будет работать (причем в любой Delphi в нем размер Char проверяется):
var
buf: TBytes;
s: String;
begin
s := Edit1.Text;
SetLength(buf, Length(s) * SizeOf(Char));
if s <> "" then Move(s[1], buf[0], Length(buf));
end;
← →
sniknik © (2011-12-03 23:00) [14]> Строку в массив байт невозможно?
не строку в массив, и зачем это, если одно и то же, а "обратное", Converts из юникода в исходный массив.
← →
Ega23 © (2011-12-03 23:01) [15]
> Строку в массив байт невозможно?
Юникод-строку в анси-строку.
← →
Юрий_ (2011-12-03 23:08) [16]
> "обратная" в общем случае невозможна. получишь набор из
> вопросов.
>
очень интересно, как вы собираетесь получить набор из вопросов в массиве байтов? Какой байт есть "вопрос"?
← →
sniknik © (2011-12-03 23:18) [17]> очень интересно,
врешь. не интересно. просто решил "пальцы погнуть"
> как вы собираетесь получить набор из вопросов в массиве байтов?
не собираюсь вообще... само получится. предупреждаю.
> Какой байт есть "вопрос"?
игра в "дурочку"? возьми ord() от него, да посмотри. или в дебаге... средств хватает.
← →
DVM © (2011-12-03 23:24) [18]
> не строку в массив, и зачем это, если одно и то же
Если речь об юникодных строках, то нельзя все же так ставить знак равенства между строкой и массивом байт. Во-первых, все же, в строке первый элемент имеет индекс 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 символы.
← →
DVM © (2011-12-03 23:27) [19]Короче, правильный ответ на [0] - это 2 функции:
TEncoding.тут нужная кодировка.GetString
TEncoding.тут нужная кодировка.GetBytes
← →
sniknik © (2011-12-03 23:38) [20]> то нельзя все же так ставить знак равенства между строкой и массивом байт.
как раз после того как стало понятно, что автор говорит про юникод "знак равенства" был скинут. ну и т.д.
и тут же пошли какие-то претензии к ответившим... какие то инсенуации в виде доп вопросов... игра в "дурочку"... странно все это.
вот скажи ты когда переспрашивал
DVM © (03.12.11 21:59) [11]
> Строку в массив байт невозможно?
правда не понял, что Ega23 имел в виду? правда, правда? или это типа "раскрытие" вопроса для автора? ну так и объяснял бы ему... а то выглядит как тупой "наезд", и "гнутье пальцев".
← →
DVM © (2011-12-03 23:50) [21]
> sniknik © (03.12.11 23:38) [20]
> как раз после того как стало понятно, что автор говорит
> про юникод
Это ж было понятно с самого начала. В D2006-2007 насколько мне известно типа TBytes нет. Появился он в D2009. Строка у него string - значит Unicode. Функции StringOf тоже нет в < D2009.
> правда не понял, что Ega23 имел в виду? правда, правда?
> или это типа "раскрытие" вопроса для автора? ну так и объяснял
> бы ему... а то выглядит как тупой "наезд", и "гнутье пальцев".
>
Я правда не понял. Я ясность пытаюсь внести в вопрос.
← →
DVM © (2011-12-04 00:01) [22]
> 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 не приведет к потере данных и обратная конвертация также всегда возможна.
← →
Германн © (2011-12-04 00:14) [23]
> Gu (03.12.11 20:31) [6]
>
> если не знаете ответа нечего писать.
> для особо непонятливых:
>
Если не умеете задавать вопросы, то нечего писать.
Надо было сразу сказать для чего вам нужны были преобразования String->TBytes и TBytes->String. Ибо такие преобразования в Д2009+ весьма неоднозначные.
← →
Ega23 © (2011-12-04 01:14) [24]
> но с поправкой на то, что массив байт можно трактовать неоднозначно,
> может этот массив это анси строка, а может UTF8 или Unicode.
>
Вот именно.
Производная от f(x) = 2x + 5 будет равна 2 для любого x
Но количество первообразных от F(x) = 2 будет бесконечно. Одна из них - таки да, будет f(x) = 2x + 5
Поэтому однозначного решения [6] нет, т.к. мы не можем однозначно утверждать, какой default system locale был выбран изначально.
← →
Германн © (2011-12-04 01:23) [25]Ну и ещё.
TBytes - это не массив байт. Это "тип" Дельфи.
Это я к тому, что если не умеешь задать правильно вопрос, то не чирикай!
← →
DVM © (2011-12-04 01:25) [26]
> 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
← →
Ega23 © (2011-12-04 02:41) [27]
> Не, ну если все происходит на одном компьютере и в течение
> работы программы не меняется локаль то все будет туда сюда
> конвертироваться однозначно.
ключевое слово "если", согласись...
> Но для передачи данных TBytes по сети такой метод не походит
> разумеется.
> Точнее подходит но кодировку надо брать UTF8 а не Default
Да не, просто надо ещё и TEncoding передавать, тогда проблем не должно быть.
← →
Юрий_ (2011-12-04 10:48) [28]
> игра в "дурочку"? возьми ord() от него, да посмотри. или
> в дебаге... средств хватает.
var B: Byte;
Какое значение надо присвоить переменной B, чтобы стало истинным выражение:
Ord(B) = "?";
Я не Мастер, я правда не понимаю. Объясните
← →
sniknik © (2011-12-04 11:04) [29]> Да не, просто надо ещё и TEncoding передавать, тогда проблем не должно быть.
UTF8 это транспортная кодировка, и универсальная с учетом страницы, это как раз аналог юникода... т.е. того во что тут конвертируется. если бы он работал в нем, то проблем бы и так не было. но он то ее пытается "вернуть" ее обратно, в состояние массива байт.
т.е. проблемы будут. обязательно будут, если раскодировать из любой юникодной/аналога в других условиях, с другой локалью, с отсутствующими в ней символами.
не придумывайте вопросу других смыслов в общем...
весь вопрос в том что нужна "обратная" функция, не понимание заметьте, он говорит, что понимает. и "понимая" не видит равенства масиву байт строке, если без конвертаций, а в представлении, не говорит о таком существенном различии сразу, а только после доп вопроса и уже "обидевшись", он типа понимает, это мы тут "тупые", не можем сразу понять чего ему надобно.
DVM © (04.12.11 00:01) [22]
> Не хотел я цепляться, но ты сам заставляешь. Вот ты пишешь:
вот тоже, типа не хотел, но придется...
а почему ты начал отвечать после "раскрытия" смысла вопроса, а не "до" когда любой вопрос на доп.инфу авторами воспринимается как личное оскорбление.
и почему потом начал не с объяснений автору того, что его "понимание" не совсем правильно, а с придирок отвечающим? которые кстати подготовили для тебя это самое "раскрытие".
← →
sniknik © (2011-12-04 11:07) [30]> Какое значение надо присвоить переменной B, чтобы стало истинным выражение:
> Ord(B) = "?";
посмотри сам
Ord(B) = Ord("?");
только с учетом версии дельфи, может быть и другая функция типа AnsiOrd.
← →
DVM © (2011-12-04 11:45) [31]
> sniknik © (04.12.11 11:04) [29]
> а почему ты начал отвечать после "раскрытия" смысла вопроса,
> а не "до" когда любой вопрос на доп.инфу авторами воспринимается
> как личное оскорбление.
> и почему потом начал не с объяснений автору того, что его
> "понимание" не совсем правильно, а с придирок отвечающим?
> которые кстати подготовили для тебя это самое "раскрытие".
>
Мне вопрос был понятен с самого начала. Я не мониторю все вопросы в реальном времени, чтоб отвечать немедленно и первым.
> StringOf = массив байт в строку. А как строку в массив байт?
Чего тут можно не понимать то? Тут не написано про Ansi строки, это все догадки. Наоборот тут обозначены Unicode строки. В вопросе фактически обозначена версия Delphi.
← →
sniknik © (2011-12-04 13:30) [32]> Мне вопрос был понятен с самого начала.
малацца
> В вопросе фактически обозначена версия Delphi.
да ну? я вот пишу на D7, и с чего мне знать, что StringOf это не функция самописка, а "фактически обозначает версию и Unicod"?
p.s. "претензии" у меня к тебе не потому что ты чего то не знаешь, а потому что начал с "наездов".
p.p.s. не у всех все также как у тебя... в смысле у спрашивающих тоже, и именно поэтому нужно приводить информацию, а не надеяться на "умолчания".
← →
абизяна (2011-12-04 14:50) [33]
> Юрий_ (04.12.11 10:48) [28]
>
> var B: Byte;
>
> Какое значение надо присвоить переменной B, чтобы стало
> истинным выражение:
>
> Ord(B) = "?";
>
> Я не Мастер, я правда не понимаю. Объясните
Вобще-то вопросительные знаки подставляет сама Windows, если в строке присутствуют значения, которых нет в использующейся кодовой таблице.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.003 c