2 402
edições
(→Encode e decode Nh: simplificando vbit_to_baseh() e corrigindo) |
|||
Linha 378: | Linha 378: | ||
ret text := ''; | ret text := ''; | ||
blk varbit; | blk varbit; | ||
bits_per_digit int; | bits_per_digit int; | ||
tr int[] := '{ {1,2,0,0}, {1,3,4,0}, {1,3,5,6} }'::int[]; -- --4h(bits,pos), 8h(bits,pos) | tr int[] := '{ {1,2,0,0}, {1,3,4,0}, {1,3,5,6} }'::int[]; -- --4h(bits,pos), 8h(bits,pos) | ||
tr_selected JSONb; | tr_selected JSONb; | ||
trtypes JSONb := '{"2":[1,1], "4":[1,2], "8":[2,3], "16":[3,4]}'::JSONb; | trtypes JSONb := '{"2":[1,1], "4":[1,2], "8":[2,3], "16":[3,4]}'::JSONb; | ||
trpos int; | trpos int; | ||
baseh "char"[] := array[ -- the standards for Baseh: | baseh "char"[] := array[ -- the standards for Baseh: | ||
Linha 395: | Linha 394: | ||
BEGIN | BEGIN | ||
vlen := bit_length(p_val); | vlen := bit_length(p_val); | ||
tr_selected := trtypes->(p_base::text) | tr_selected := trtypes->(p_base::text); | ||
IF p_base=2 THEN | IF p_base=2 THEN | ||
RETURN $1::text; -- | RETURN $1::text; -- bit string as string | ||
END IF; | END IF; | ||
bits_per_digit := (tr_selected->>1)::int; | bits_per_digit := (tr_selected->>1)::int; | ||
pos0 := (tr_selected->>0)::int; | pos0 := (tr_selected->>0)::int; | ||
trpos := tr[pos0][bits_per_digit]; | trpos := tr[pos0][bits_per_digit]; | ||
FOR counter IN 1.. | FOR counter IN 1..(vlen/bits_per_digit) LOOP | ||
blk := substring(p_val FROM 1 FOR bits_per_digit); | blk := substring(p_val FROM 1 FOR bits_per_digit); | ||
ret := ret || baseh[trpos][ varbit_to_int(blk,bits_per_digit) ]; | ret := ret || baseh[trpos][ varbit_to_int(blk,bits_per_digit) ]; | ||
p_val := substring(p_val FROM bits_per_digit+1); | p_val := substring(p_val FROM bits_per_digit+1); | ||
END LOOP; | END LOOP; | ||
vlen := bit_length(p_val); | vlen := bit_length(p_val); | ||
IF p_val!=b'' THEN | IF p_val!=b'' THEN | ||
trpos := tr[pos0][vlen]; | trpos := tr[pos0][vlen]; | ||
ret := ret || baseh[trpos][ varbit_to_int(p_val,vlen) ]; | ret := ret || baseh[trpos][ varbit_to_int(p_val,vlen) ]; | ||
Linha 426: | Linha 421: | ||
CREATE FUNCTION natcod.baseh_to_vbit( | CREATE FUNCTION natcod.baseh_to_vbit( | ||
p_val text, -- input (enforced lower case) | p_val text, -- input (enforced lower case) | ||
p_base int DEFAULT | p_base int DEFAULT 16 -- selecting base2h, base4h, base8h, or base16h. | ||
) RETURNS varbit AS $f$ | ) RETURNS varbit AS $f$ | ||
DECLARE | DECLARE | ||
tr_hdig jsonb := '{ | tr_hdig jsonb := '{ | ||
" | "G":[1,0],"Q":[1,1], | ||
" | "H":[2,0],"M":[2,1],"R":[2,2],"V":[2,3], | ||
" | "J":[3,0],"K":[3,1],"N":[3,2],"P":[3,3], | ||
" | "S":[3,4],"T":[3,5],"Z":[3,6],"Y":[3,7] | ||
}'::jsonb; | }'::jsonb; | ||
tr_full jsonb := '{ | tr_full jsonb := '{ | ||
Linha 446: | Linha 441: | ||
BEGIN | BEGIN | ||
ret = ''; | ret = ''; | ||
blk := regexp_match(p_val,'^([0-9a-f]*)([ | blk := regexp_match(p_val,'^([0-9a-f]*)([GHJKMNP-TVZY])?$'); | ||
IF blk[1] >'' THEN | IF blk[1] >'' THEN | ||
FOREACH i IN ARRAY regexp_split_to_array(blk[1],'') LOOP | FOREACH i IN ARRAY regexp_split_to_array(blk[1],'') LOOP |
edições