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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.033 c
14-1085295633
R
2004-05-23 11:00
2004.06.13
Почему Пепси


14-1085374627
syte_ser78
2004-05-24 08:57
2004.06.13
Посоветуйте хостинг


1-1085990013
novill
2004-05-31 11:53
2004.06.13
Как результат MethodAddress использовать в качестве Tnotifyevent.


6-1082652506
37
2004-04-22 20:48
2004.06.13
Браузер


14-1085402204
www
2004-05-24 16:36
2004.06.13
Как начать лекцию?





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