редактирование массива шестнадцатеричных строк в переполнении стека

Я пытаюсь получить RGB-значения для планшета с моего сайта. Планшет принимает только команды SICP.
В настоящее время я использую netcat для установления соединения следующим образом:

$cmd = 'echo -n -e "\x09\x01\x00\xf3\x01\xff\x80\x00'.$checksum.'" | nc '.$ip.' '.$port;
shell_exec($cmd);
echo $cmd;

Это работает для планшета, но я все еще не могу сделать переменные для 3 значений RGB из-за моего калькулятора контрольной суммы, требующего гекса формат.
Я могу сделать массив гекса в PHP («hexstrcomp»), где последние 4 значения RGB и контрольная сумма.

$hexshowndec = array("09","01","00","f3", "01", "ff", "80", "00", "00");
$hexstrcomp = array("\x09","\x01","\x00","\xf3","\x01","\xff","\x80","\x00","\x00");
for ($i = 0; $i < 8; $i++)  // 8 for message length before checksum
{
$byte = $hexstrcomp[$i];
$hexstrcomp[8] = $hexstrcomp[8] ^ ord($byte);
echo "Current checksum: " . sprintf("%02x", $hexstrcomp[8]) . "<br>"; // 0x23
}
echo "Checksum: " . sprintf("%02x", $hexstrcomp[8]);

$cmd = 'echo -n -e "\x' . $hexshowndec[0]
. '\x' . $hexshowndec[1]
. '\x' . $hexshowndec[2]
. '\x' . $hexshowndec[3]
. '\x' . $hexshowndec[4]
. '\x' . $hexshowndec[5]
. '\x' . $hexshowndec[6]
. '\x' . $hexshowndec[7]
. '\x' . sprintf("%02x", $hexstrcomp[8])
. '" | nc '.$ip.' '.$port;
shell_exec($cmd);
echo "<p>Orange!</p>";

Как я могу изменить значение для hexstrcomp [5], например, чтобы я все еще мог успешно использовать свою контрольную сумму? Пробовал следующее, вызывая ошибку контрольной суммы:

$hexshowndec[6] = sprintf("%02x", $hexstrcomp[6]); //gets this done
$hexstrcomp[6] = "\x00";    // works, but need variable for 00 part
$hexstrcomp[6] = "\x{$hexshowndec[6]}";    // fails
$hexstrcomp[6] = "\x" . $hexshowndec[6];    // fails

1

Решение

принимать $hexshowndec[6] превратить его в десятичную с hexdec() затем превратить его в символ (необработанный байт в вашем случае) с chr()

$hexstrcomp[6] = chr( hexdec( $hexshowndec[6] ) );

На самом деле вы можете создать $hexstrcomp программно из $hexshowndec с тем же подходом и циклом foreach:

$hexshowndec = array("09", "01", "00", "f3", "01", "ff", "80", "00", "00");
$hexstrcomp = array();
foreach( $hexshowndec as $hsd ) {
$hexstrcomp[] = chr( hexdec ( $hsd ) );
}

…или с более коротким лайнером:

$hexshowndec = array("09", "01", "00", "f3", "01", "ff", "80", "00", "00");
$hexstrcomp = str_split( pack( "H*", implode( '', $hexshowndec ) ) );

Ваш скрипт для произвольной длины ввода:

$hexshowndec = array( "09", "01", "00", "f3", "01", "ff", "80", "00", "00");
$hexstrcomp = str_split( pack( "H*", implode( '', $hexshowndec ) ) );

// The last byte is for checksum and initially set to 0x00
$n = count( $hexshowndec ) - 1;

for( $i = 0; $i < $n; $i++ )
{
$byte = $hexstrcomp[ $i ];
$hexstrcomp[ $n ] = $hexstrcomp[ $n ] ^ ord( $byte );
}

$cmd = 'echo -n -e "';
for( $i = 0; $i < $n; $i++ )
{
$cmd .= '\x' . $hexshowndec[ $i ];
}

$cmd .= '\x' . sprintf( "%02x", $hexstrcomp[ $n ] );
$cmd .= '" | nc '.$ip.' '.$port;

shell_exec( $cmd );
1

Другие решения

Других решений пока нет …