plpgsql - 没有正确解压缩字节

时间:2012-05-05 22:42:22

标签: plpgsql

我在plpgsql unpack_numeric_bytes中编写了一个函数,函数中最重要的部分是:

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;

它运作良好,直到我遇到它没有正确解码的价值..它可能太明显但我没有看到它。

电话是:select unpack_numeric_bytes(E'g\\363I\\274', array[4], 'f');

代码v_length是4个字节,它会尝试解码E'g\\363I\\274' 其中涉及:{-1136004249} ..我注意到了 2 ^ 32 - 1136004249 = 3158963047,这是我正在寻找的正确答案! (用python unpack函数测试它。)

什么扔掉了?我做错了什么?这是该功能第一次让我失望。

谢谢!

1 个答案:

答案 0 :(得分:1)

发现问题所在:

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

修正了这一行:

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