我正在开发一个套接字程序(使用recvfrom
),该程序会返回一个char缓冲区。但是,接收到的数据包含多个null
个字符,因此我无法轻松对其进行后期处理。
我想问是否有任何方法可以逃避如果在缓冲区中间找到空字符?
目标是将二进制数据存储到cassandra DB中。我试图忽略空字符并将其直接存储到数据库中。但是,它将仅存储部分字符串。在研究中,我了解到可以使用TextAsBlob()
函数将接收到的数据转换为blob。尽管这并没有改变任何东西,但是只有部分数据存储在DB中(直到第一个空值都可以看到)。
所以,我需要知道是否有办法逃脱它们?我有可用的接收数据长度。
对于打印数据,我正在使用%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);
答案 0 :(得分:0)
您是说不应将这些数据称为文本,然后使用TextToBlob()
进行存储。 TextToBlob()
会将您的数据称为文本(并尝试将其存储为二进制数据),但这正是您所不想要的。因为如果将其称为文本,则每0表示字符串终止。
您想将recvfrom
接收到的该数据存储在指向某些数据结构的某个指针中,或者仅存储在void *
中。因为否则,每个null
(0)字节都将称为字符串结尾。
因此,您应该以您知道的大小分配一些内存,然后不使用任何字符串(字符数组)函数将所有这些数据读取到该地址。