2012-05-05 4 views
0

j'ai écrit une fonction dans plpgsql unpack_numeric_bytes, la partie la plus importante des fonctions est:plpgsql - octets ne reçoivent pas déballés droit

FOR i IN 1..v_length LOOP 
    v_val := v_val + (get_byte(v_bytes, v_byte_index) << v_bit_shift); 
    v_bit_shift := v_bit_shift + 8; 
    v_byte_index := v_byte_index + 1; 
END LOOP; 

Il a bien fonctionné jusqu'à ce que je suis tombé sur la valeur qu'il na pas décodent correctement. et c'est peut-être trop évident mais je ne le vois pas.

L'appel est: select unpack_numeric_bytes(E'g\\363I\\274', array[4], 'f');

À partir du code v_length est de 4 octets et il essaie de décoder E'g\\363I\\274' Ce qui revient à: {-1136004249} .. J'ai remarqué que 2^32-1136004249 = 3158963047, et est la bonne réponse que je cherche! (testé avec la fonction python unpack).

Qu'est-ce qui le rejette? et qu'est-ce que je fais mal? C'est la première fois que la fonction m'a échoué.

Merci!

+0

I figured it out .. mais ne peut pas poster ma réponse encore. Il doit être casté à bigint. – t0x13

Répondre

1

trouvé quel était le problème:

select ('10111100000000000000000000000000'::bit(32))::integer; 
int4 | -1140850688 
-- versus 
select (('10111100000000000000000000000000'::bit(32))::bigint); 
int8 | 3154116608 

fixe cette ligne:

v_val := v_val + (get_byte(v_bytes, v_byte_index)::BIGINT << v_bit_shift)::BIGINT; 
+0

Nice. Acceptez maintenant votre propre réponse pour fermer la question. – vyegorov

+0

J'ai essayé .. Il dit que je ne peux le faire que demain :) – t0x13

Questions connexes