Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.03.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.008 c
2-1323074402
gvozdkoff
2011-12-05 12:40
2012.03.18
длина строк в TStringList


2-1322986484
I_D
2011-12-04 12:14
2012.03.18
Типизированный текстовый файл. Переход с Delphi 7 на Delphi XE


15-1321986296
dreamse
2011-11-22 22:24
2012.03.18
Настройка размера шрифта в редакторе кода


15-1322080202
Юрий
2011-11-24 00:30
2012.03.18
С днем рождения ! 24 ноября 2011 четверг


15-1322239708
Димка На
2011-11-25 20:48
2012.03.18
Сложные судоки