Текущий архив: 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
Thehtonl
function converts au_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.53 MB
Время: 0.033 c