Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];

Вниз

Кодирование буфера   Найти похожие ветки 

 
trxnet ©   (2010-01-11 14:58) [0]

Здраствуйте. Имеется одна проблема. Вобщем я читаю данные из сокета в буфер Buf: Array [0..4096] of Byte. В этом буфере содержится текст + управляющие символы строки (ну все как положено вобщем). Вот мне необходимо текст, который содержится в буфере конвертировать в Unicode кодировку, не трогая управляющие символы и затем уже Unicode-текс обратно поместить в этот буфер. Процедуры кодирования с использованием String не подходят, поскольку если мы перекодируем буфер в String, то управляющие символы туда не попадут. Помогите пожайлуста, как можно реализовать данную вещь. Спасибо.


 
Anatoly Podgoretsky ©   (2010-01-11 15:12) [1]

> trxnet  (11.01.2010 14:58:00)  [0]

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


 
KSergey ©   (2010-01-11 15:14) [2]

Ну первое что мне приходит на ум - выделять из буфера куски строк между управляющими символами, конвертировать их, а потом назад все раскладывать включая неконвертированные упр. символы, не забывая про то, что юникод - в 2 раза длинее.

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


 
test ©   (2010-01-11 15:15) [3]

Похоже на Indy, там параметр в true ставишь и получаешь нормально строку.


 
trxnet ©   (2010-01-11 15:23) [4]

Просто когда на сокет получаю данные, от клиента вот так:

procedure TForm1.sReceive(MSocket: TMySocket);
var
  Len: Integer;
  Buf: Array [0..4096] of Char;
  Msg: String;
begin
        Len := MSocket.GetBuf(Buf,SizeOf(Buf));
        client.SendBuf(Buf,Len);

        while Len > 0 do
        begin
           Msg := Msg + Copy(Buf, 1, Len);
           Len := MSocket.GetBuf(Buf, SizeOf(Buf));
         end;

end;

Вот так я принимаю и потправляю клиенту буфер. Только в данном случае тип буфера Char это не работает, т.к почемуто управляющие символы не входят сюда.

Но если сделать вот так:
procedure TForm1.sReceive(MSocket: TMySocket);
var
  Len: Integer;
  Buf: Array [0..4096] of Byte;
  Msg: String;
begin
        Len := MSocket.GetBuf(Buf,SizeOf(Buf));
        client.SendBuf(Buf,Len);

end;

То все прекрасно работает, клиент понимает что ему пришло.


 
trxnet ©   (2010-01-11 15:25) [5]

Т.е схема такая, клиент послылает серверу строку, сервер ее обрабатывает и конвертирует в Unicode и затем отсылает клиенту.


 
soldier   (2010-01-11 15:26) [6]

У людей избыток серверов =)


 
trxnet ©   (2010-01-11 19:58) [7]

А если серьезно?


 
Германн ©   (2010-01-11 19:59) [8]


> А если серьезно?

Либо [1], либо [2]


 
trxnet ©   (2010-01-11 20:21) [9]


Либо [1], либо [2]


Хорошо) А как это сделать ?) И как смотреть, что это управляющий символ или нет.


 
test ©   (2010-01-11 20:27) [10]

trxnet ©   (11.01.10 20:21) [9]
По коду


 
Anatoly Podgoretsky ©   (2010-01-11 20:30) [11]

> trxnet  (11.01.2010 20:21:09)  [9]

Отладчик тебе для чего дан?


 
trxnet ©   (2010-01-11 20:50) [12]

Чтобы работу отлаживать)) А откуда она возмется то работа, если нечего не работает))

В по делу, эквивалент в Delphi:
\0 - тут какой ?
\n -#13
\r -#10


 
Anatoly Podgoretsky ©   (2010-01-11 20:52) [13]

> trxnet  (11.01.2010 20:50:12)  [12]

По образцу и подобию получается, что #0


 
test ©   (2010-01-11 20:55) [14]

trxnet ©   (11.01.10 20:50) [12]
\0 он и есть 0. Может тебе пересмотреть код? Посмотри TStream и классы производные от него, там по мойму было все что тебе надо, прием передача по сети исходный код можно посмотреть в Indy.


 
Демо ©   (2010-01-11 21:10) [15]


> trxnet ©   (11.01.10 14:58) 


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


 
trxnet ©   (2010-01-11 21:33) [16]

Потому что клиент сторонний) test, за наводку спасибо. Нашел :)


 
Dimka Maslov ©   (2010-01-12 12:25) [17]

Управляющие символы тоже закодированы в юникоде.


 
test ©   (2010-01-12 15:51) [18]

Dimka Maslov ©   (12.01.10 12:25) [17]
Ему TStream либо все перегонит либо ничего, так что пока он с этой ситуацией не столкнется, тем более что ему в [0] уже об этом сказали.


 
trxnet ©   (2010-01-13 02:07) [19]

Эх, ничего не вышло... Процедура так которую я отыскал оказывается вовсе этим не занимается(

test, а если буфер перегнать в MemoryStream из него в String а потом, опять в MemoryStream и в из него в буффер?

На самом деле я реализую в проге конвертер мыла, т.е клиент запрашивает письмо с сервера, письмо в любой кодировке, моя прога его декодит в UTF8 и отправляет клиенту, т.к клиент понимает только юникод и использовать нужно именно этот клиент! Я реализовывал через String (вобщето через String все замечательно работает и работало с другими клиентами, но не с этим). Послал письмо через прогу, заголовок в нем закодирован в UTF8 как надо, но клиент выдает кракозябры. Решил проверить правильно ли я закодировал. Взял письмо с UTF8 кодировкой, подключил клиент напряму к серверу и получил нормальное читаемое письмо в клиенте. Посмотрел "код"  письма и удивился: Заголовок который я кодировал с помощью моей проги, совпадает с тем, что клиент получил с мейл-сервера напрямую. Как ни шаманил не знаю почему он себя так ведет. Сразу подумал на управляющие символы... Возможно это не так. Может есть у кого какие мысли?


 
Германн ©   (2010-01-13 02:24) [20]


> trxnet ©   (13.01.10 02:07) [19]
>
> Эх, ничего не вышло... Процедура так которую я отыскал оказывается
> вовсе этим не занимается(
>

Ещё один выпускник кулинарного техникума, которого заставили заниматься программированием?


 
trxnet ©   (2010-01-13 11:32) [21]

Не кулинарного техникума, а техникума здорового питания)) Ну все таки есть че-нить путное ?


 
Сергей М. ©   (2010-01-13 12:10) [22]


> trxnet ©   (13.01.10 11:32) [21]


> есть че-нить путное ?


"Путное" будет после того как ты сподобишься пояснить, откуда у тебя взялся этот несуразный код и какие конкретно сокетные компоненты ты используешь ..


 
Anatoly Podgoretsky ©   (2010-01-13 17:26) [23]

> trxnet  (13.01.2010 11:32:21)  [21]

Только в техникуме не научили готовить здоровую пищу.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.05 c
15-1262483235
Германн
2010-01-03 04:47
2010.04.04
OnTimer или где?


15-1263644504
AlexDan
2010-01-16 15:21
2010.04.04
dll библиотеки и линукс..


15-1263251045
Smile
2010-01-12 02:04
2010.04.04
Германн или где?


6-1215631058
Квэнди
2008-07-09 23:17
2010.04.04
Версия удаленного файла


15-1263287483
Ega23
2010-01-12 12:11
2010.04.04
А почему такая ерунда с Новым Годом?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский