LINUX.ORG.RU

Perl как упаковать 64 bit?


0

0

Почему на 32 bit платформе не работает упаковка в quad? И как можно это обойти? Дело в том, что для взаимодействия с процессом (сделан на C) используется shared memory. В программе на C присутствует int64_t. И надо в эту область записать.

pack('q',$value) выкидывает:

Invalid type 'q' in pack in ....

Как можно это обойти? важно чтобы запись происходила быстро, так как на время записи происходит блокировка основного процесса, который не может быть надолго блокирован.

★★

Ну если переносимость между архитектурами неважна - то, видимо, запаковывать побайтно (или пословно) во временный буфер, потом хватать мутекс и копировать.

И, кстати, а что это у вас за $value, что вы хотите паковать один скаляр в 64 бита на 32-битной платформе?

anonymous
()

pack('ll', $value, 0) ?

anonymous
()
Ответ на: комментарий от anonymous

>Ну если переносимость между архитектурами неважна - то, видимо, запаковывать побайтно (или пословно) во временный буфер, потом хватать мутекс и копировать.

Как это проще всего сделать?

olegk ★★
() автор топика
Ответ на: комментарий от theserg

>может всётаки семафор?

По этому поводу все ясно и уже сделано. Вот замучался с long long. Заранее не учел, что perl может выдать такую фигню. Теперь и не знаю, что делать.

olegk ★★
() автор топика
Ответ на: комментарий от olegk

Неужели не существует простого решения?
А то у меня получилось нечто полурабочее,
причем не учитывающее знака, а он тоже необходим:

sub pack_quad {
	my $quad = shift;
	my $temp;
	while ($quad != 0) {
		$temp .= sprintf('%02x',$quad % 256);
		$quad = int($quad / 256);
	}
	return pack('(H2)8',unpack('(A2)*',$temp));
}

olegk ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.