@@ -237,10 +237,51 @@ static int32_t encode_al(const char *kind, const uint8_t *raw, int32_t raw_len,
237237 return kvspaceXvalueEncode (kind , raw , raw_len , dims , nd , out );
238238}
239239
240+ #define KVSPACE_HEAD64 64
241+ static int looks_head64 (const uint8_t * d , int32_t n ) {
242+ if (!d || n < KVSPACE_HEAD64 )
243+ return 0 ;
244+ if (d [1 ] > KVSPACE_STORETYPE_EXTINDEX || d [3 ] > X_MAX_NDIM )
245+ return 0 ;
246+ uint64_t bl = 0 , cap = 0 ;
247+ for (int i = 0 ; i < 8 ; i ++ ) {
248+ bl |= (uint64_t )d [8 + i ] << (i * 8 );
249+ cap |= (uint64_t )d [16 + i ] << (i * 8 );
250+ }
251+ if (bl > cap || (int32_t )KVSPACE_HEAD64 + (int32_t )bl > n )
252+ return 0 ;
253+ return 1 ;
254+ }
255+
240256xvalue_head_t kvspaceXvalueDecodeHead (const uint8_t * data , int32_t data_len ) {
241257 xvalue_head_t h = {0 };
242258 if (!data || data_len < X_HEAD_PREFIX )
243259 return h ;
260+ if (looks_head64 (data , data_len ) && rd_u16 (data ) != X_HEAD_PREFIX ) {
261+ uint8_t st = data [1 ];
262+ uint8_t ndim = data [3 ];
263+ uint64_t bl = 0 ;
264+ for (int i = 0 ; i < 8 ; i ++ )
265+ bl |= (uint64_t )data [8 + i ] << (i * 8 );
266+ h .headlen = KVSPACE_HEAD64 ;
267+ h .ref = (int32_t )(int8_t )data [0 ];
268+ if (h .ref < 0 )
269+ h .ref = KVSPACE_REF_EXT ;
270+ h .storetype = st ;
271+ h .ro = data [2 ] & 1 ;
272+ h .vid = rd_u32 (data + 4 );
273+ h .raw_len = (int32_t )bl ;
274+ h .ndim = ndim ;
275+ for (int i = 0 ; i < ndim && i < X_MAX_NDIM ; i ++ )
276+ h .dims [i ] = (int32_t )rd_u32 (data + 28 + i * 4 );
277+ h .langtype = "" ;
278+ h .langtype_len = 0 ;
279+ h .kind = "" ;
280+ h .kind_len = 0 ;
281+ h .raw = data + KVSPACE_HEAD64 ;
282+ h .array_len = store_has_dims (st ) ? header_array_len (h .ndim , h .dims ) : 1 ;
283+ return h ;
284+ }
244285 h .headlen = rd_u16 (data );
245286 h .ref = data [2 ];
246287 h .storetype = data [3 ];
0 commit comments