<?php
$score = 64;
$firstName = 'Jack';
$lastName = 'Saliv';
$age = 21;
$expected = 'FFFEFF404A00610063006B00530061006C00690076FFFEFF15';
$expectedCorrected = 'FFFEFF404A00610063006B00530061006C0069007600FFFEFF15';
// Convert to UTF-16LE and get hex, https://stackoverflow.com/a/16080439/231316
$nameAsUtf16LE = unpack('H*', mb_convert_encoding($firstName.$lastName, 'UTF-16LE', 'UTF-8'));
// UTF-16LE BOM
$utf16LeBom = 'FFFE';
// Convert to hex strings
$scoreAsHex = dechex($score);
$ageAsHex = dechex($age);
$finalString = sprintf(
'%1$s%2$s%3$s',
$utf16LeBom.$scoreAsHex,
strtoupper($nameAsUtf16LE[1]), // This is 1-based, not 0-based
$utf16LeBom.$ageAsHex,
);
$numberPadding = 'FF';
$finalStringWithNumbersPadded = sprintf(
'%1$s%2$s%3$s',
$utf16LeBom.$numberPadding.$scoreAsHex,
strtoupper($nameAsUtf16LE[1]), // This is 1-based, not 0-based
$utf16LeBom.$numberPadding.$ageAsHex,
);
echo 'Calculated : '.$finalString;
echo PHP_EOL;
echo 'Padded : '.$finalStringWithNumbersPadded;
echo PHP_EOL;
echo 'Expected : '.$expected;
echo PHP_EOL;
echo 'Expected Corrected : '.$expectedCorrected;
assert($finalStringWithNumbersPadded === $expectedCorrected);
preferences:
24.31 ms | 409 KiB | 5 Q