А чем ваш юникод отличается от другого набора байтов?
Ну да, длина строки и количество занимаемых ей байтов не равны, но даже std::string в своей реализации имеет отдельные length и capacity.
Для «общения» с недоверенным источником очевидно лучше передавать байтовый размер, так как в конце может оказаться 0x80, а вы будете пытаться считать еще байт, что по сути примерно то же самое что и отсутствующий ноль при ожидании null-terminated строки.
Давно придумали VLQ и его вариации. Первый бит обозначает наличие следующего байта, остальные биты — знаковые.
Получается для строк длиной до 127 (27) байт нужен 1 байт, для строк длиной до 16383 (214) — 2 байта и т.д.
Есть еще другой вариант — BER (и ASN.1), который используется, например, в SNMP: если установлен первый бит, то следующие 7 бит означают количество следующих байт содержащих значение, если же первый бит не установлен, то в следующих 7 битах само значение.
То есть для коротких строк (до 127 байт) будет всё тот же один байт, а для сверхдлинных в несколько мегабайт говорить об экономии 4-5 байт как-то глупо, не говоря уже о том, что это вообще странная затея передавать (и принимать) огромные строки не зная когда они закончатся. Ведь по сути именно это и породило многочисленные переполнения буфера с вытекающими из этого уязвимостями.
Кстати, в Delphi (камнями не кидаться), например, у типа String есть размер, но для совместимости в конце есть и null. PChar(string) вернет вполне валидную null-terminated строку (а PInteger(PChar(string)-4) будет указателем на её длину), но при этом программа на Delphi не будет испытывать неудобств в работе с нулями в самой строке.
А вот вам исходник strlen() из FreeBSD:
size_t strlen(const char *str) {
const char *s;
for (s = str; *s; ++s);
return(s - str);
}
maps.rosreestr.ru/Portal/terms.html
Условия использования
Любое копирование Данных, воспроизведение, переработка, распространение, размещение в свободном доступе (опубликование) в сети Интернет, любое использование в средствах массовой информации и/или в коммерческих целях без предварительного письменного разрешения правообладателя запрещается, за исключением случаев, прямо предусмотренных настоящим Соглашением.
Было бы о чём писать. Как такового распознавания в конкретном случае не нужно.
В отличие от Зумы в этой игре «шары» всегда на заданных местах — достаточно брать цвет одного-двух пикселей каждого шара и пространства между ними, чтобы точно определить состояние поля.
Как-то, преследуя аналогичную цель сделал переключение раскладки на CapsLock. С тех пор так и работает, но я ей всё равно не пользуюсь, но ужасно бесит когда нажимаю её случайно :)
Проводим олимпиаду — в эту пятницу 26 июня в 22:00 по Москве. Будет опубликована задача в новом топике. Ответы будут приниматься до 23:59 того же дня.
Открою вам страшный секрет. Только никому не говорите. За МКАД-ом существуют другие часовые пояса.
Мне, например, до 2 часов придется не спать что бы увидеть условие задачи? А потом еще до 4 над ней думать? :) А еще есть более удаленные от Москвы регионы. Хотя, им достаточно будет проснуться пораньше :)
Ну да, длина строки и количество занимаемых ей байтов не равны, но даже std::string в своей реализации имеет отдельные length и capacity.
Для «общения» с недоверенным источником очевидно лучше передавать байтовый размер, так как в конце может оказаться 0x80, а вы будете пытаться считать еще байт, что по сути примерно то же самое что и отсутствующий ноль при ожидании null-terminated строки.
Получается для строк длиной до 127 (27) байт нужен 1 байт, для строк длиной до 16383 (214) — 2 байта и т.д.
Есть еще другой вариант — BER (и ASN.1), который используется, например, в SNMP: если установлен первый бит, то следующие 7 бит означают количество следующих байт содержащих значение, если же первый бит не установлен, то в следующих 7 битах само значение.
То есть для коротких строк (до 127 байт) будет всё тот же один байт, а для сверхдлинных в несколько мегабайт говорить об экономии 4-5 байт как-то глупо, не говоря уже о том, что это вообще странная затея передавать (и принимать) огромные строки не зная когда они закончатся. Ведь по сути именно это и породило многочисленные переполнения буфера с вытекающими из этого уязвимостями.
Кстати, в Delphi (камнями не кидаться), например, у типа String есть размер, но для совместимости в конце есть и null. PChar(string) вернет вполне валидную null-terminated строку (а PInteger(PChar(string)-4) будет указателем на её длину), но при этом программа на Delphi не будет испытывать неудобств в работе с нулями в самой строке.
А вот вам исходник strlen() из FreeBSD:
А по ссылке из glibc.
Не очень то дешевая операция для такой простой, казалось бы, задачи.
Всё ещё хотите работать со строками неизвестной длины?
Условия использования
Любое копирование Данных, воспроизведение, переработка, распространение, размещение в свободном доступе (опубликование) в сети Интернет, любое использование в средствах массовой информации и/или в коммерческих целях без предварительного письменного разрешения правообладателя запрещается, за исключением случаев, прямо предусмотренных настоящим Соглашением.
В отличие от Зумы в этой игре «шары» всегда на заданных местах — достаточно брать цвет одного-двух пикселей каждого шара и пространства между ними, чтобы точно определить состояние поля.
Правда попроще — распознавал поле и эмулировал действия мыши.
Открою вам страшный секрет. Только никому не говорите. За МКАД-ом существуют другие часовые пояса.
Мне, например, до 2 часов придется не спать что бы увидеть условие задачи? А потом еще до 4 над ней думать? :) А еще есть более удаленные от Москвы регионы. Хотя, им достаточно будет проснуться пораньше :)