Символьный буфер с несколькими нулевыми символами - PullRequest
0 голосов
/ 30 мая 2019

Я работаю над программой-сокетом (использующей recvfrom), которая возвращает мне буфер char.Однако полученные данные содержат несколько символов null, и это не позволяет мне легко обрабатывать их.

Я хотел бы спросить, есть ли способ избежать нулевых символов, если они найдены в середине буфера?

Цель состоит в том, чтобы сохранить двоичные данные в базе данных Cassandra.Я попытался игнорировать нулевые символы и сохранить его непосредственно в БД.Однако он будет хранить только частичную строку.В ходе исследования я узнал, что могу использовать функцию TextAsBlob() для преобразования полученных данных в блоб.Хотя это ничего не изменило, в БД хранятся только частичные данные (до появления первого нулевого значения).

Итак, мне нужно знать, есть ли способ избежать их?У меня есть длина полученных данных.

Для печати данных я печатаю данные, используя %c байт за байтом.

Структура таблицы:

cqlsh:network> desc packet;

CREATE TABLE network.packet (
    key text PRIMARY KEY,
    value blob
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

cqlsh:network>



cqlsh:network> SELECT * from packet;

 key                                            | value
------------------------------------------------+--------------------
 1234                                           |     0x70e54c5bfd7f
 1235        

Ошибка:

cqlsh:network> SELECT blobAsText(value) FROM network.packet WHERE key = '1234' ;
InvalidRequest: Error from server: code=2200 [Invalid query] message="In call to function system.blobastext, value 0x70e54c5bfd7f is not a valid binary representation for type text"

Команда вставки:

 char key[5] = 1234;
// value is received from socket. 

INSERT INTO network.packet (key, value) VALUES (key, value);

1 Ответ

0 голосов
/ 30 мая 2019

Вы говорите, что эти данные не должны называться текстом, а затем вы используете TextToBlob() для их хранения.TextToBlob() будет ссылаться на ваши данные как text (и будет пытаться сохранить их как двоичные данные), но это именно то, что вы не хотели бы.Потому что, если бы его называли текстом, каждый 0 означал бы завершение строки.

Вы бы хотели сохранить эти данные, полученные recvfrom, в некотором указателе на некоторую структуру данных или, может быть, просто на void *.Потому что в противном случае каждый байт, равный null (0), будет называться концом строки.

Итак, вам следует выделить некоторую память в том размере, который, как вы говорите, вы знаете, а затем прочитать все этоданные по этому адресу без использования строковых функций (массивов символов).

...