Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1323075473
Елена
2011-12-05 12:57
2012.03.18
загрузка BitMap из не стандартного файла.


2-1322731427
Laguna
2011-12-01 13:23
2012.03.18
Контроль отправки письма по Email


2-1322847714
ffffffee
2011-12-02 21:41
2012.03.18
Как отправить Record через IdTCPClient ?


15-1315555388
Василий Жогарев
2011-09-09 12:03
2012.03.18
Перевод заголовочного файла *.h в подключаемый модуль *.pas


1-1289241191
DevilDevil
2010-11-08 21:33
2012.03.18
BASM overload





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский