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

Вниз

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

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

Наверх




Память: 0.52 MB
Время: 0.013 c
15-1263384716
pavel_guzhanov
2010-01-13 15:11
2010.04.04
новый лохотрон с СМС


15-1263208174
ocean
2010-01-11 14:09
2010.04.04
Как восстановить флешку?


2-1265019868
Unior
2010-02-01 13:24
2010.04.04
Как открыть запароленный *.mdb в Access?


10-1165236483
Alex_C
2006-12-04 15:48
2010.04.04
Закрытие сервера


3-1237815167
victor
2009-03-23 16:32
2010.04.04
PickList