![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Предлагаю вашему вниманию такой тип темы.
В чём смысл. Имеется некий код, написанный на определённом языке. Имеется необходимость реализовать тот же самый код, но на языке делфи. Данная тема служит для уточнения правильности и точности перевода кода. Последний раз редактировалось seeman_tm, 14.05.2013 в 13:01. |
|
#2
|
||||
|
||||
|
Кто-нить позовите Кэпа?
|
|
#3
|
||||
|
||||
|
Имеется код, написанный на языке ActionScript, таково вида:
Код:
internal static function createBlocksFromString(arg1:String):Array
{
var loc1:*=new Array();
var loc2:*=arg1.length * 8;
var loc3:*=255;
var loc4:*=0;
while (loc4 < loc2)
{
loc1[loc4 >> 5] = loc1[loc4 >> 5] | (arg1.charCodeAt(loc4 / 8) & loc3) << 24 - loc4 % 32;
loc4 = loc4 + 8;
}
loc1[loc2 >> 5] = loc1[loc2 >> 5] | 128 << 24 - loc2 % 32;
loc1[(loc2 + 64 >> 9 << 4) + 15] = loc2;
return loc1;
}
public static var digest:flash.utils.ByteArray;Этой функции я придал следующий вид: Код:
Type ArrayOfInteger = Array Of Integer;
function createBlocksFromString(arg1:String):ArrayOfInteger;
var loc1 :ArrayOfInteger;
var loc2 : Integer;
var loc3: Integer;
var loc4: Integer;
Begin
// loc1:*=new Array();
loc2 := LenGth(arg1) * 8;
SetLenGth(loc1,loc2);
loc3 :=255;
loc4 :=0;
while (loc4 < loc2) do
Begin
loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[Round(loc4 / 8)]) And loc3) shl 24 - loc4 mod 32;
loc4 := loc4 + 8;
End;
loc1[loc2 shr 5] := loc1[loc2 shr 5] or 128 shl 24 - loc2 mod 32;
loc1[(loc2 + 64 shr 9 shl 4) + 15] := loc2;
Result := loc1;
End;Код рабочий и ошибок не выдаёт, но загвоздка в следующем. Будут ли результаты функции полностью идентичны в первом и втором случае ? Имеются ли здесь ошибки ? |
|
#4
|
||||
|
||||
|
используй отладчики
|
|
#5
|
||||
|
||||
|
Цитата:
|
|
#6
|
|||
|
|||
|
для начала не
Код:
Round(loc4 / 8) Код:
loc4 div 8 Код:
loc4 shr 3 и расставить скобки в сложных выражениях, и побольше , поскольку приоритеты операций в Delphi могут отличаться от ActionScript. Например в 21 строке - точно нужны. |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
seeman_tm (14.05.2013)
| ||
|
#7
|
||||
|
||||
|
icWasya, разницы не увидел, но выглядит лучше. Так что возьму в обиход.
Так же нашел неточность в переводе. ActionScript: Код:
loc1[loc4 >> 5] = loc1[loc4 >> 5] | (arg1.charCodeAt(loc4 / 8) & loc3) << 24 - loc4 % 32; Было в делфи: Код:
loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[Round(loc4 / 8)]) And loc3) shl 24 - loc4 mod 32; Но так как у переменных типа String в Delphi первый символ имеет индекс 1 (массивы начинаются с 0 для первого элемента). А в переменных типа String в ActionScript, первый символ имеет индекс 0 как и просто массивы. Поэтому: Код:
loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[Round(loc4 / 8)+1]) And loc3) shl 24 - loc4 mod 32; Код:
loc1[loc4 shr 5] := loc1[loc4 shr 5] or (Byte(arg1[(loc4 div 8)+1]) And loc3) shl 24 - loc4 mod 32; Кто нить ещё увидел ошибку ? |
|
#8
|
||||
|
||||
|
Нет возможности обкатать функцию в ActionScript и посмотерть на её результаты в этом языке.
Поэтому, пока что обкатываю в JavaScript. Надеюсь у них приоритеты операций идентичны. А по сему, функция и выражения в ней для делфи получили следующий вид: Код:
Type ArrayOfInteger = Array Of Integer;
function createBlocksFromString(arg1:String):ArrayOfInteger;
var loc1 :ArrayOfInteger;
var loc2 : Integer;
var loc3: Integer;
var loc4: Integer;
Begin
// loc1:*=new Array();
loc2 := LenGth(arg1) * 8;
SetLenGth(loc1,(((loc2 + 64) shr 9) shl 4) + 15);
loc3 :=255;
loc4 :=0;
while (loc4 < loc2) do
Begin
loc1[loc4 shr 5] := (loc1[loc4 shr 5]) or (byte(arg1[(loc4 div 8)+1]) and loc3) shl ((24 - loc4) mod 32);
loc4 := loc4 + 8;
End;
loc1[loc2 shr 5] := loc1[loc2 shr 5] or (128 shl ((24 - loc2) mod 32));
loc1[(((loc2 + 64) shr 9) shl 4) + 15] := loc2;
Result := loc1;
End;to icWasya, ещё раз благодарю за наводку про скобки и разноправие операций в виражениях. Последний раз редактировалось seeman_tm, 16.05.2013 в 12:30. |