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

Вниз

Как расшифровать строку?   Найти похожие ветки 

 
Alek   (2004-05-29 14:36) [0]

есть строка, вічисляется ее длина и затем записывается двумя байтами.

Chr(Hi(length(str)))+Chr(Lo(length(str)))

так вот как затем назад получить нормальную длину строки??


 
GuAV ©   (2004-05-29 14:47) [1]

Никак. Два средних байта потеряно :-(


 
jack128 ©   (2004-05-29 14:49) [2]


> Два средних байта потеряно :-(
По моему второй и четвертый..надо проверить :-)


 
GuAV ©   (2004-05-29 14:57) [3]


> По моему второй и четвертый..

procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
begin
I:=$1234ABCD;
ShowMessageFmt("%X %X",[ord(Chr(Hi(I))),ord(Chr(Lo(I)))]);
end;

LOL
Первые два.


 
jack128 ©   (2004-05-29 14:59) [4]


> По моему второй и четвертый
да, бред. Что то мя глючнуло, что Hi/Lo - слово возвращают..

Note: Hi treats Integer as a 16-bit value, even if it is 32-bit.

соответственно теряются два последних байта, тоесть если строка < 32k, то все ОК

var
 s: string;

> s := Chr(Hi(length(str)))+Chr(Lo(length(str)))


NewLength := byte(s[2]) shl 8 + byte(s[1]);


 
GuAV ©   (2004-05-29 15:12) [5]


> Первые два.

vs

> теряются два последних байта


Endian-neutral coding vs Assume little endian :-)


 
Alek   (2004-05-29 15:17) [6]

> NewLength := byte(s[2]) shl 8 + byte(s[1]);

для чего тут смещение на 8 ??


 
GuAV ©   (2004-05-29 15:17) [7]


> Endian-neutral coding vs Assume little endian :-)

Просьба не воспринимать всерьёз эту шутку.


 
jack128 ©   (2004-05-29 15:19) [8]


> > Первые два.
>
> vs
>
> > теряются два последних байта
Победила дружба :-) Я не видел твоего поста. Тоже проверял, смотрл почему именно так получилось, а не как я думал..

> Endian-neutral coding vs Assume little endian :-)
мая английския - плохой..Совсем плохой -)
Совместно о словарем перевел как (слова Endian не нашел, предпологаю, что индеец) Нейтрально-индейское кодирование против маленьного притворщика-идейца :-))


 
GuAV ©   (2004-05-29 15:24) [9]

А ещё так сабж реализовать можно.
swap(pword(@S[1])^)

little endian
сначала младший бит, с конца старший. как в твоём компе.

big endian
сначала старший бит, с конца младший. как мы пишем.


 
GuAV ©   (2004-05-29 15:27) [10]

... извините нажал добавить рано
endian-neutral - не иметь никаких предположений по поводу битов в слове. Чтобы шло типа на всех платформах.


> Совместно о словарем перевел как (слова Endian не нашел,
> предпологаю, что индеец) Нейтрально-индейское кодирование
> против маленьного притворщика-идейца :-))

LOL


 
SammIk ©   (2004-05-29 15:30) [11]

Теряются 2 и 4 баиты, следовательно
если строка больше $FF, то нельзя восстановить размер.
А если не секрет, зачем такое делаешь?


 
jack128 ©   (2004-05-29 15:30) [12]


> > NewLength := byte(s[2]) shl 8 + byte(s[1]);
>
> для чего тут смещение на 8 ??

Ну я снова видимо пургу погнал.
byte(s[1]) shl 8 + byte(s[2])


 
jack128 ©   (2004-05-29 15:33) [13]


> А если не секрет, зачем такое делаешь
я не такое, но что то типа токого делал для связи с одним девайсом.. Ну такое у него было представление целых чисел..


 
GuAV ©   (2004-05-29 15:34) [14]


> Теряются 2 и 4 баиты, следовательно

Выполни код [3]


 
SammIk ©   (2004-05-29 15:34) [15]


> jack128 ©   (29.05.04 15:30) [12]

А че это ты этим делаешь?


 
Alek_1   (2004-05-29 15:35) [16]

значит идея такая.
Я передаю по сокету строку и для того чтобі сервер правильно ее прочитал (не больше, не меньше) я передаю заголовок в котором помещаю длину строки вот в таком виде

s := Chr(Hi(length(str)))+Chr(Lo(length(str)))

сервак ее обрабатывает так как нужно и правильно считываети данные.

А вот когда сервак передает мне такой же пакет, я немогу правильно его считать, так как не могу узнать длину строки.


 
GuAV ©   (2004-05-29 15:37) [17]


> Ну такое у него было представление целых чисел..

представление в виде Большого индеца, что-ли ;-)


 
Alek_1   (2004-05-29 15:39) [18]

byte(s[1]) shl 8 + byte(s[2]) - вот это подошло

Спасибо!!!


 
SammIk ©   (2004-05-29 15:40) [19]

Если честно, я так и не понял в чем был вопрос?
Обьясните?


 
GuAV ©   (2004-05-29 15:42) [20]

Alek_1   (29.05.04 15:35) [16]

Менять младший бит со старшим - swap.
для 32бит - BSWAP (asm)


 
jack128 ©   (2004-05-29 15:45) [21]


> А че это ты этим делаешь?
этим это чем? Вот этим?

> byte(s[1]) shl 8 + byte(s[2])


в первом байте строки храниться старший байт младшего слова Length(str), во втором байте - младший байт младшего слова.. Соответственно выделяю длину строки (ну естественно старшое слово Length(str) - мы благополучно профукали ;-))
Вобщем тоже что и GuAV


> [16] Alek_1   (29.05.04 15:35)

ну тогда уж попроще.

function EncodeStr(s: string): string;
var
 Len: Integer;
begin
 Len := Length(s);
 SetLength(Result, Len + SizeOf(Len));
 move(Len, PChar(Result)^, SizeOf(Len));
 move(PChar(s)^, PChar(PChar(Result) + SizeOf(Len))^, len * SizeOf(Char));
end;

function DecodeStr(s: string): string;
var
 Len: Integer;
begin
 Move(PChar(s)^, Len, SizeOf(Len));
 SetLength(Result, Len);
 move(PChar(PChar(s) + SizeOf(Len))^, PChar(Result), len * SizeOf(Char));
end;


 
SammIk ©   (2004-05-29 15:48) [22]

Как это делается и так ясно, мне не ясен смысл всеи этои канители))
А Hi, lo я даже не задумывался, что они со словами работают.


 
jack128 ©   (2004-05-29 15:51) [23]


> Как это делается и так ясно, мне не ясен смысл всеи этои
> канители))
Алек же все объяснил в > > [16] Alek_1   (29.05.04 15:35)


 
GuAV ©   (2004-05-29 15:51) [24]


> старшое слово Length(str) - мы благополучно профукали ;-))

Потому что BSWAP не юзали. Инструкция специально для преобразования индейцев.
asm
 MOV EAX,Len
 BSWAP EAX
 MOV Len,EAX
end;


 
SammIk ©   (2004-05-29 15:54) [25]

Почти все ясно)))
Тока зачем переворачивать?


 
GuAV ©   (2004-05-29 15:58) [26]


> Тока зачем переворачивать?


[16]

> для того чтобі сервер правильно ее прочитал (не больше,
> не меньше)

Война Больших и маленьких индейцев ;-)


 
GuAV ©   (2004-05-29 16:04) [27]

ЗЫ: Везде где я писал бит просьба читать байт...
просто чего-то про те биты вспомнил :-)


 
SammIk ©   (2004-05-29 16:04) [28]

Дык куды ты их пихаешь-то, эти длинны строк?
Если на том серваке стаит какои-то другои проц(не интел и его клоны), тогда ясно. А если интел, тогда зачем извращатся
и переворачивать слова?


 
GuAV ©   (2004-05-29 16:07) [29]


> А если интел, тогда зачем извращатся
> и переворачивать слова?


Может прога на серваке уже сделана таким образом.
Или не интел, тогда дейстаительно индейский конфликт.


 
SammIk ©   (2004-05-29 16:12) [30]

Эх, а какая мне разница)))
Еще вот есть htonl, htons.


 
GuAV ©   (2004-05-29 16:22) [31]

2SammIk ©

ntohl vs htonl - можете популярно объяснить разницу?
или Хрущев предложил разделить министерство транспорта на туда и обратно?


 
Anatoly Podgoretsky ©   (2004-05-29 17:07) [32]

SammIk ©   (29.05.04 16:04) [28]
Какая разница что стотит с той и другой стороны, процессор даже не знает, что ему передали какую то длину, этим занимается клиентская программа.


 
Alek_1   (2004-05-30 01:35) [33]

Чтобі не было споров насчет процесора, скажу что на серверной и на клиентской машине стоит интеловский пенек.


 
GuAV ©   (2004-05-30 10:31) [34]

Alek_1   (30.05.04 01:35) [33]

Imho, уже был правильный ответ:
SammIk ©   (29.05.04 16:12) [30]

> Еще вот есть htonl, htons.


 
Alek_1   (2004-05-30 10:40) [35]

ответ был, но я смотрю после него еще дискусия продолжалась :)


 
SammIk ©   (2004-05-30 12:29) [36]

2[32]
Вот и я говорю, зачем(темболее если это интел) переворачивать
слова? Больше ведь гемору потом будет.
Автор сервака походу поприкалывался)))


 
GuAV ©   (2004-05-30 12:41) [37]


> Автор сервака походу поприкалывался)))

Не автор сервака а автор TCP/IP :) Цитирую MSDN:
htonl The htonl function converts a u_long from host to TCP/IP network byte order (which is big endian).


 
SammIk ©   (2004-05-30 12:50) [38]

Такое преобразование нужно в заголовках протоколов.
А все данные которые, этими протоколоми передаются,
всем сетевым устроиствам побоку.
Следовательно зачем переворачивать длинны, если к протоколам
они отношения не имеют?



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

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.024 c
14-1085373809
Паниковский
2004-05-24 08:43
2004.06.13
Как зовут ICQ под Линухом и как ее настраивать?


1-1086087813
Dysan
2004-06-01 15:03
2004.06.13
проблема с динимическики массивами


1-1085724426
CyberSpy
2004-05-28 10:07
2004.06.13
Child


14-1085835393
p.0$a
2004-05-29 16:56
2004.06.13
HELP plz


14-1085376070
ega23
2004-05-24 09:21
2004.06.13
Хокку дня....