URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6069
[ Назад ]

Исходное сообщение
"Строки в Перл и завершающий символ"

Отправлено Raist , 11-Янв-07 17:35 
Столкнулся только что с такой проблемой, Программа на перл общается по сети с программой на Си. Ситуация (примерный кусок кода)
$text = "bla bla bla);
$dataSize = length($text);
syswrite($socket,$dataSize);
syswrite($socket,$text);

Что мы получаем на сторона Си, dataSize = длине строки но без завершающего нуля, поэтому обработчки этой строки, вылазит за границы и получается полная кака. Ну да ладно, может нужно делать так?
$dataSize = length($text) + 1;
Ан нет, syswrite все равно посылает данные длиной просто length($text), тоесть никакого завершающего символа и в помине нет! (можно конечно асильно заставить послыать syswrite на одни байт больше, но толку?
Собвстенно как решить эту проблему? Не описывать же все строки в перле как "bla-bla-bal\0"


Содержание

Сообщения в этом обсуждении
"Строки в Перл и завершающий символ"
Отправлено BigHo , 11-Янв-07 18:41 
>Столкнулся только что с такой проблемой, Программа на перл общается по сети
>с программой на Си. Ситуация (примерный кусок кода)
>$text = "bla bla bla);
>$dataSize = length($text);
>syswrite($socket,$dataSize);
>syswrite($socket,$text);
>
>Что мы получаем на сторона Си, dataSize = длине строки но без
>завершающего нуля, поэтому обработчки этой строки, вылазит за границы и получается
>полная кака. Ну да ладно, может нужно делать так?
>$dataSize = length($text) + 1;
>Ан нет, syswrite все равно посылает данные длиной просто length($text), тоесть никакого
>завершающего символа и в помине нет! (можно конечно асильно заставить послыать
>syswrite на одни байт больше, но толку?
>Собвстенно как решить эту проблему? Не описывать же все строки в перле
>как "bla-bla-bal\0"

Как ни странно, то такой метод не самый плохой. Наращивать строку всего на один байт - лишние накладные расходы, особена когда строка особено велика. Поэтому можно сделать функцию:
sub submit {
.   my ($sock, $s) = @_;
.   $l = len($s);
.   if ($l > $pagesize) {
.       syswrite($sock, $s, $l); # Иногда лучше сделать два системных вызова, чем копировать большой объем информации.
.       syswrite($sock, "\0");
.   } else {
.       syswrite($sock, $s . "\0");
.   }
};

Лучше конечно передавать не завершающий символ в качестве определителя конца строки, а в начале строки указывать длину передаваемого буфера. В этом случае на стороне C программы всегда надо будет увеличивать длину на 1, т.к. даже строка нулевой длины в UNIX занимает длину в 1 байт.