在 PostgreSQL 中将 bytea 表示为单个整数的最简单方法是什么?

2023-11-21

我有一个bytea包含 14 字节数据的列。 14 个字节的最后 3 个字节包含数据的 CRC 码。我想将 CRC 提取为单个整数以存储在新列中。

我该怎么做呢?

为了澄清这一点,下面是在 Java 中执行此操作的一种方法:

int crc = ((rawData[len - 3] & 0xff) << 16 |
            (rawData[len - 2] & 0xff) << 8 |
            (rawData[len - 1] & 0xff)) & 0xffffff;

我希望找到一种无需移位的解决方案,即类似接受 4 个字节并将其转换为整数的方法。


另一种方法是提取最后 6 个字符hex表示,前置一个x并直接投射:

db=# SELECT ('x' || right('\x00000000000001'::bytea::text, 6))::bit(24)::int;
 int4
------
    1

..比get_byte()路线,但也是一条未记录的功能PostgreSQL 的。不过,我引用汤姆·莱恩在这里:

这依赖于位类型输入的一些未记录的行为 转换器,但我认为没有理由认为它会损坏。一个可能的 更大的问题是它需要 PG >= 8.3 因为没有文本 在那之前进行位转换。

此相关答案中的详细信息:

  • 将文本表示形式的十六进制转换为十进制数

这假设您的设置bytea_output is hex,这是自 9.0 版本以来的默认设置。可以肯定的是,您可以为您的会话测试/设置它:

SET bytea_output = 'hex';

更多这里:

  • 缩略图图像的 PostgreSQL 9.X bytea 以“十六进制”或“转义”表示

表现

我在一个有 10k 行的表上运行了一个测试(10 次中最好)。get_byte()Postgres 9.1 中实际上更快一些:

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
,(get_byte(a, 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PostgreSQL 中将 bytea 表示为单个整数的最简单方法是什么? 的相关文章

随机推荐

  • 你能强制 ImageMagick 使用 PNG-8 alpha 透明度吗?

    当我尝试通过 Imagemagick 运行一堆具有 alpha 透明度的 PNG 8 图像时 它会将它们转换为 PNG 32 从而大大增加了文件大小 是否可以强制 Imagemagick 将我的图像类型保留为 8 位 PNG 你可以这样做
  • 失败时自动再次尝试 AJAX 请求

    我看到你可以指定如果 ajax 请求失败一般要做什么 是否可以让它在某种循环中重试 以便它在停止之前至少尝试 x 次 我之前使用过这段代码 ajaxSetup error function alert error 这将适用于所有 AJAX
  • 在 5.0 中打开项目后无法在 Xcode 4.6 中打开项目

    我在 Xcode 5 中打开了错误版本的项目 现在 Xcode 4 6 在尝试打开该项目时崩溃了 我只在 Xcode 5 中更改了一个 xib 文件 并使用 Xcode 5 在 IB 中打开了 xib 并在 Interface Builde
  • MATLAB 中的 SVM 可视化

    在 Matlab 中执行 SVM 训练后 如何可视化 SVM 分类 到目前为止 我只用以下方法训练了 SVM Labels are 1 or 1 groundTruth Ytrain d xtrain model svmtrain grou
  • 如何创建 JSON 数组?

    你好 我想创建一个 JSON 数组 我尝试过使用 JSONArray jArray new JSONArray while itr hasNext int objId itr next jArray put objId odao getOb
  • 带参数的 Java Webstart

    我可以启动一个Java网络启动具有一组参数的应用程序就像使用 标签配置小程序一样 Thanks 是的 您可以 下面显示了一个示例
  • HTML5/JS - 启动多个网络工作者

    我目前正在编写一个程序 我必须处理巨大的数组 但是我可以拆分这些数组 我现在的计划是 在不同的网络工作者中处理数组 然而 我从未与他们合作过 并且确实有几个问题 1 我将如何运行多个网络工作者 我尝试了一个看起来像这样的 for 循环 fo
  • Angular 如何测试@HostListener

    我有以下指令 当应用于输入元素时 它会检查字符并在禁止字符时调用 PreventDefault Directive selector cdtPreventInput export class PreventInputDirective im
  • 从google帐户获取用户名、头像

    我正在开发一个使用 GoogleAccountCredential 登录 上传和下载文件到 GoogleDrive 的模块 我想让谷歌帐户的用户名 姓氏和头像显示在我的登录功能上 I ve try GoogleAccountCredenti
  • 使 ASP.NET WCF 将字典转换为 JSON,省略“Key”和“Value”标签

    这是我的困境 我正在使用 RESTful ASP NET 服务 尝试获取一个函数来返回以下格式的 JSON 字符串 Test1Key Test1Value Test2Key Test2Value Test3Key Test3Value 但我
  • Python变量是指针吗?或者说,它们是什么?

    据我所知 Python 中的变量只是指针 根据这条规则 我可以假设此代码片段的结果 i 5 j i j 3 print i 将会3 但我得到了一个令我意想不到的结果 那就是5 此外 我的 Python 书确实介绍了这个示例 i 1 2 3
  • 不需要的双导航栏

    当我点击屏幕时 我使导航栏 顶部栏 出现 消失 并且也位于背景图像的顶部 它有效 但有一个问题 我突然有两个导航栏 首先 有一个名为 后退 的后退按钮 当我按 后退 时 它会弹出一个新的导航栏 其中有一个名为 Vinene 的后退按钮 这是
  • glClear(GL_COLOR_BUFFER_BIT) 后 OpenGL 无效帧缓冲区操作;

    每次我打电话后glClear GL COLOR BUFFER BIT 我收到 OpenGL 错误 无效的帧缓冲区操作 通话似乎工作正常 没有任何问题 我打电话glClear GL COLOR BUFFER BIT 第一件事在 paintGL
  • 这个规范的集群示例是如何工作的?

    当必须通过文件系统同步程序 shell脚本 时 我发现了一种flock基于的解决方案是受到推崇的 也应该工作on NFS 在脚本中使用的规范示例 来自http linux die net man 1 flock is flock s 200
  • C# 中的 URL Slugify 算法?

    所以我搜索并浏览了slug标记 SO 并只找到两个引人注目的解决方案 C 中的 Slugify 和字符转写 如何在 C 中将上标或下标转换为普通文本 这只是问题的部分解决方案 我可以自己手动编写代码 但令我惊讶的是还没有解决方案 那么 C
  • 大约持续 2 秒后出现“设备上没有剩余空间”的信息EMR m1.large 实例上有 10 GB 数据

    当我使用 m1 large 作为作业流要创建的 hadoop 实例的实例类型来运行 Amazon EMR 作业时 我收到错误 设备上没有剩余空间 该工作产生约 最大 10 GB 数据 因为 m1 large 实例的容量应该为 420GB 2
  • 有没有办法使用 EF Core 映射复杂类型

    EF Core 不支持复杂类型映射 如果我有一个对象 例如 public class Entity public string StringProp get set public SubEntity NestedEntity get set
  • 如何获取当前用户目录?

    使用这个 Environment GetFolderPath Environment SpecialFolder ApplicationData 我得到这个输出 C Documents and Settings USER Applicati
  • GIT:在新/脏/开发分支中将更改提交到旧/安全分支,而不检出或丢失未暂存的数据

    在开始进行实验性开发之前 我创建了一个新分支 我通常会忘记这一点 这不是问题 但现在我提前做了 从那时起我已经更新了3个文件 2 中只是实验性更改 我不想将其提交到安全分支 在 1 中只是安全 较小的 更改 我绝对希望将其提交到安全分支 我
  • 在 PostgreSQL 中将 bytea 表示为单个整数的最简单方法是什么?

    我有一个bytea包含 14 字节数据的列 14 个字节的最后 3 个字节包含数据的 CRC 码 我想将 CRC 提取为单个整数以存储在新列中 我该怎么做呢 为了澄清这一点 下面是在 Java 中执行此操作的一种方法 int crc raw