2014-11-11 5 views
3

Является ли sz массивом символов, а также какой memset указывает на буфер? Как преобразовать следующий код на C++ в Delphi?Что такое Delphi, эквивалентный memset C++?

int data = _ttoi(m_Strtag.GetBuffer(0)); 
unsigned char sz[4]; 
memset(sz,0, 4); 
sz[0] = (unsigned char)((data >> 24) & 0xFF); 
sz[1] = (unsigned char)((data >> 16) & 0xFF); 
sz[2] = (unsigned char)((data >> 8) & 0xFF); 
sz[3] = (unsigned char)(data & 0xFF); 

Это вызов Дельфи: , если SAAT_YTagSelect (л.с., isenable, 1, SZ, 4), то ...

для следующей функции: DELPHI

function SAAT_YTagSelect(pHandle: Pointer; nOpEnable1, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall; 
+1

http://pastebin.com/Y9ZvzNMX – TLama

+1

'FillChar' является эквивалентом. Вы действительно хотите, чтобы мы перевели остальную часть кода для вас? Вы понимаете побитовые операции? –

+2

Все байты в sz установлены после этого, нет необходимости предустановить их с нулем. И андинг с $ FF можно удалить. –

ответ

8

Эквивалентный до memset - FillChar и заполняет диапазон байтов байтом.

Поскольку все байты в массиве sz устанавливаются, когда порядок байтов data отменен, эта строка может быть удалена.

Разворот

байт может быть упрощена немного (замена and $FF с ограничением типа):

data := StrToInt(aString); 
sz[0] := Byte(data shr 24); 
sz[1] := Byte(data shr 16); 
sz[2] := Byte(data shr 8); 
sz[3] := Byte(data); 

Заключив назначение с Byte(), компилятор сказал, чтобы пропустить проверку диапазона. Сравнение генерируемого кода сборки (с проверкой на диапазон), показывает, что это также дает более эффективный код:

Project1.dpr.36: sz[0] := Byte(data shr 24); 
0041C485 A1BC3E4200  mov eax,[$00423ebc] 
0041C48A C1E818   shr eax,$18 
0041C48D A2C03E4200  mov [$00423ec0],al 


Project1.dpr.40: sz[0] := (data shr 24) and $FF; 
0041C485 A1BC3E4200  mov eax,[$00423ebc] 
0041C48A C1E818   shr eax,$18 
0041C48D 25FF000000  and eax,$000000ff 
0041C492 3DFF000000  cmp eax,$000000ff 
0041C497 7605    jbe $0041c49e 
0041C499 E8F290FEFF  call @BoundErr 
0041C49E A2C03E4200  mov [$00423ec0],al 

Более прямой способ заполнения массива SZ, без bitshifting подпрограмм:

sz[0] := PByte(@data)[3]; 
sz[1] := PByte(@data)[2]; 
sz[2] := PByte(@data)[1]; 
sz[3] := PByte(@data)[0]; 
+1

Вы уверены, что это не приведет к ошибкам с проверкой диапазона? –

+2

@DavidHeffernan, да, я дважды проверял :) –

+0

Возможно, стоит упомянуть проблемы вокруг побитовых операторов сдвига на знаках со знаком. Код в вопросе выглядит сомнительным, если не сказать больше. –