El código en C tiene cosas que faltan.
1. crc debe estar inicializado.
2. Si asumimos la cadena como "estilo C", x debe inicializarse a 0.
3. Asumimos que count el la longitud de la cadena pero debería estar en el código y su cálculo correspondiente.
4. Tampoco sabemos si la cadena es unicode.
Con el código C preparado de esta forma, el resultado es 17940:
Código PHP:
typedef WORD ushort;
int GetCRC()
{
CHAR *data = "13|0000123|1|Maximilian|Mustermann|05051999|21092019";
ushort crc = 0;
int x = 0;
int i;
int count = lstrlen(data);
while (--count >= 0){
ushort z = (ushort)(data[x++] << 8);
crc = (ushort)(crc ^ z);
i = 8;
do{
if ((crc & 0x8000) != 0)
crc = (ushort)(crc << 1 ^ 0x1021);
else
crc = (ushort)(crc << 1);
} while (--i > 0);
}
return crc;
}
La traducción equivalente a delphi usando String, devuelve el mismo resultado (17940):
Código Delphi
[-]
function GetCRC: integer;
var
S: String;
i, x: Integer;
z: WORD;
CRC: WORD;
SLength, n: Integer;
begin
S := '13|0000123|1|Maximilian|Mustermann|05051999|21092019';
CRC:= 0;
SLength := Length(S);
X := 1;
while SLength > 0 do
begin
Z := WORD(S[X]) shl 8;
CRC := CRC xor Z;
i:= 8;
repeat
if (CRC and $08000) <> 0 then
CRC := (CRC shl 1) xor $1021
else
CRC := (CRC shl 1);
dec(i);
until i <= 0;
Inc(X);
Dec(SLength);
end;
Result:= CRC;
end;
Alcaraciones sobre la traducción:
1. Las cadenas delphi empiezan el indice = 1; en C comienzan en 0
2. x++ significa que tras las evaluaciones/operaciones se incrementará x
3. --i significa que i de decrementa antes que cualquier otra cosa que de haga con i (por ello uso repeat - until decrementando i consiguiendo una traducción casi literal) y por lo mismo cambio el límite de count en su bucle.
Conclusión: ambos códigos arrojan el mismo resultado y "algo" falta en la inicialización de las variables, probablemente en crc
Saludos.