Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Разработка
Войти через OpenID

Разработка Раздел для совместной разработки/доработки программы

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 04.11.2010, 09:21   #1
Новичок
 
Регистрация: 06.06.2009
Сообщений: 28
Сказал Спасибо: 8
Имеет 5 спасибок в 5 сообщенях
Asmoday пока неопределено
По умолчанию Delphi 2010 и функции HexToString/StringToHex

Доброго времени суток всем! Вобщем-то вопрос по большей части наверно адресован xkor'у. Вобщем в связи с некоторыми недоработками в D2007 был вынужден перепрыгнуть на D2010. В следствие чего возникла небольшая проблемка, функциии преобразования работают не корректно. После преобразования данных из хекса в строку и отправки вместо:
PHP код:
4A000000000A000000000014043E04310440043E0420003F043E04360430043B043E043204300442044C0420003D04300420003D0430044804200041043504400432043504400421000000 
получаю:
PHP код:
4A0000000000000000000A000000000000000000000014003E00310040003E0020003F003E00360030003B003E003200300042004C0020003D00300020003D003000480020004100350040 
Функции:
PHP код:
function StringToHex(str1,Separator:String):String;
var
  
i:Integer;
begin
  Result
:='';
  for 
i:=1 to Length(str1) do begin
    Result
:=Result+IntToHex(Byte(str1[i]),2)+Separator;
  
end;
end;

function 
SymbolEntersCount(sstring): string;
var
  
iinteger;
begin
  Result 
:= '';
  for 
:= 1 to Length(s) do
    if 
not CharInSet(s[i],[' ',#10,#13]) then
      
Result:=Result+s[i];
end;

function 
HexToString(Hex:String):String;
var
  
bt:Byte;
  
i:Integer;
begin
  Result
:='';
  
Hex:=SymbolEntersCount(UpperCase(Hex));
  for 
i:=0 to (Length(Hexdiv 2)-do begin
    bt
:=0;
    if (
Byte(hex[i*2+1])>$2F)and(Byte(hex[i*2+1])<$3A)then
      bt
:=Byte(hex[i*2+1])-$30;
    if (
Byte(hex[i*2+1])>$40)and(Byte(hex[i*2+1])<$47)then
      bt
:=Byte(hex[i*2+1])-$37;
    if (
Byte(hex[i*2+2])>$2F)and(Byte(hex[i*2+2])<$3A)then
      bt
:=bt*16+Byte(hex[i*2+2])-$30;
    if (
Byte(hex[i*2+2])>$40)and(Byte(hex[i*2+2])<$47)then
      bt
:=bt*16+Byte(hex[i*2+2])-$37;
    
Result:=Result+char(bt);
  
end;
end
Я не могу понять по какому алгоритму идет преобразование, потому собственно и не могу поправить самостоятельно. Думаю связано это с тем что D2010 внесено много изменений касающихся строк. Хотелось бы услышать пояснение к коду.
ЗЫ: Сори за нубство =)

Вопрос снят. Порывшись нарыл вот это:
Цитата:
В Delphi 2009 строковым типом по умолчанию является новый тип UnicodeString. По умолчанию UnicodeString схож с кодировкой UTF-16, той же самой, что используется в Windows. Это отличие от предыдущей версии, в которой по умолчанию использовался тип AnsiString. Раньше в Delphi RTL для обработки данных в формате Юникод использовался тип WideString, но этот тип, в отличие от AnsiString, не подсчитывал количество ссылок (not reference-counted) и поэтому не мог рассматриваться Delphi-разработчиками как строковый тип по умолчанию.

Для Delphi 2009 новый тип UnicodeString был разработан таким образом, чтобы сочетать в себе достоинства и AnsiString, и WideString. UnicodeString может содержать как Юникод-символы, так и однобайтные ANSI символы. (Имейте ввиду, что Вы по-прежнему можете использовать AnsiString и WideString). Типы Char и PChar теперь олицетворяют соответственно WideChar и PWideChar. Учтите, что ни один тип строк не исчез, все типы, которыми пользовались разработчики, по-прежнему существуют и работают точно так же, как и раньше.

Итак, в Delphi 2009 обычная строка (string) будет эквивалентна UnicodeString, обычный символ (Char) – это теперь WideChar, а указатель на него (PChar) – это PWideChar.
Таким образом просто указывал типы строк не String, а AnsiString.

Для тех кому интересно почитать полный текст статей:
http://edn.embarcadero.com/article/38446
http://edn.embarcadero.com/article/38582
http://edn.embarcadero.com/article/38703

Последний раз редактировалось Asmoday, 04.11.2010 в 09:22. Причина: Добавлено сообщение
Asmoday вне форума   Ответить с цитированием
Старый 04.11.2010, 15:30   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Asmoday, вот ещё в качестве бонуса более быстрый и стабильный вариант StringToHex:
delphi Код:
function StringToHex(str1: AnsiString; sep: AnsiChar = #0): AnsiString; const   hexAlf: array[0..15] of AnsiChar = '0123456789ABCDEF'; var   i,size:Integer; begin   size:=Length(str1);   if sep=#0 then begin     SetLength(Result,size*2);     for i:=1 to size do begin       Result[i*2-1]:=hexAlf[Byte(str1[i]) shr 4];       Result[i*2]:=hexAlf[Byte(str1[i]) and $f];     end;   end else begin     SetLength(Result,size*3);     for i:=1 to size do begin       Result[i*3-2]:=hexAlf[Byte(str1[i]) shr 4];       Result[i*3-1]:=hexAlf[Byte(str1[i]) and $f];       Result[i*3]:=sep;     end;   end; end;
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился 6 спасибками от:
Старый 30.01.2011, 05:07   #3
Новичок
 
Регистрация: 06.06.2009
Сообщений: 28
Сказал Спасибо: 8
Имеет 5 спасибок в 5 сообщенях
Asmoday пока неопределено
По умолчанию

xkor, тут еще вопросик к тебе, попытался перекомпилить inject.dll в 2010, но ничего не получилось. После долгих раздумий пришел к выводу, что проблема заключается в advAPIHook.pas. Нет ли готового решения? Не хочется перелопачивать несколько десятков функции.
Asmoday вне форума   Ответить с цитированием
Старый 31.01.2011, 01:57   #4
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Asmoday, боюсь не использовал пока этот модуль на 2009+ дельфе...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Разработка



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 20:29.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!