在PostgreSQL中将bytea表示为单个整数的最简单方法是什么?
我有一个包含14个字节数据的bytea列. 14的最后3个字节包含数据的CRC码.我想将CRC提取为一个整数,以存储在新列中.
我该怎么做呢? 为了澄清,这是在Java中实现它的一种方法: int crc = ((rawData[len - 3] & 0xff) << 16 | (rawData[len - 2] & 0xff) << 8 | (rawData[len - 1] & 0xff)) & 0xffffff; 我希望找到一个没有位移的解决方案,即类似于接受4个字节并将它们转换为整数的方法.
另一种方法是以十六进制表示形式提取最后6个字符,预先添加x并直接转换:
db=# SELECT ('x' || right('x00000000000001'::bytea::text,6))::bit(24)::int; int4 ------ 1 ..比get_byte()路由短一点,但也是PostgreSQL的一个未记录的功能.但是,我引用Tom Lane here:
这个相关答案的细节: > Convert hex in text representation to decimal number 这假设您的bytea_output设置为十六进制,这是自9.0版以来的默认设置.当然,您可以为会话测试/设置它: SET bytea_output = 'hex'; 更多信息: > PostgreSQL 9.X bytea representation in ‘hex’ or ‘escape’ for thumbnail images 性能 我在一个有10k行的桌子上进行了测试(最好的10个).在Postgres 9.1中,get_byte()实际上要快一点: CREATE TEMP TABLE t (a bytea); INSERT INTO t SELECT (12345670000000 + generate_series(1,10000))::text::bytea; 比特移位与乘法/加法一样快: SELECT ('x' || right(a::text,6))::bit(24)::int -- 34.9 ms,(get_byte(a,11) << 16) + (get_byte(a,12) << 8) + get_byte(a,13) -- 27.0 ms,11) << 16) | (get_byte(a,12) << 8) | get_byte(a,13) -- 27.1 ms,get_byte(a,11) * 65536 + get_byte(a,12) * 256 + get_byte(a,13) -- 27.1 ms FROM t (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- org.xmlpull.v1.XmlPullParserException: Binary XML file
- Ruby#等效C#’使用’语句
- PC蓝牙通信C#代码实现
- 如何在XML Schema中为fractionDigits限制指定最小值?
- c# – 从windows安装程序安装后为什么不添加app.config?
- ruby-on-rails – 在rails配置文件和javascript之间共享变量
- Swift学习笔记NSCache
- COCOS2D-X 停止手打所有cpp文件到android.mk
- Flash Builder导出发行版本出错:创建AIR出错:error306,D
- c# – 当sqlchars和sqlstring时?