【问题标题】:Byte order conversion with mysql native function用mysql原生函数进行字节顺序转换
【发布时间】:2013-08-17 07:52:34
【问题描述】:

我从一个文件中读取了 4 个字节的二进制字符串。 4 字节的二进制字符串是大端,代表一个 32 位整数。但我的机器是小端(英特尔)。所以我需要将大端的4字节二进制字符串转换为32位小端整数。

mysql 中是否有任何本机函数可以处理这个问题?一个例子将不胜感激。

谢谢。

更新: OS 相关函数或 c/c++ 标准库在 mysql 项目中受到高度限制,在这种情况下几乎无法使用。

【问题讨论】:

  • C、C++ 或 SQL,你需要什么?
  • @alk "我需要用 C 语言在 mysql 源代码中将大端序的 4 字节字符串转换为 32 位小端序整数"。
  • 如果有“工具”不能使用,我想知道你为什么要标记这个 C 或 C++。
  • 据我所知,没有 SQL 函数可以做你想做的事。您可能想使用 MySQL-SQL 设置自己的存储过程。
  • @alk 因为mysql源码是c/c++的。

标签: c++ mysql c endianness


【解决方案1】:

对于 C,您可以使用 ntohl() 将 32 位(即 4 个字节)整数转换为主机字节顺序。

它的原型应该位于<arpa/inet.h>

更新

ntoh/hton 系列函数由 POSIX 标准定义。

它将网络字节顺序转换为主机字节顺序和签证。

网络字节顺序被定义为大端。

【讨论】:

  • OS 依赖函数或 c/c++ 标准库在 mysql 项目中受到高度限制。它几乎不能用于我的情况。我想要更多关于 mysql 本机功能的建议。无论如何,感谢您的努力。
  • 我想我最好自己写。你的回答被接受了,因为它有帮助。
【解决方案2】:

您可以将 32 位 little endian 原始整数数据从 s 列中的偏移量 N 开始转换为如下所示的小数:

conv(hex(reverse(substr(s, N + 1, 4))), 16, 10)

我发现此页面正在寻找一种无需编写 UDF 的更有效的方法。使用 UDF 是否简单且非常高效 - 您可以手动完成,无需任何库调用,但是,您必须了解 C,并且您必须对服务器有足够的访问权限才能安装 UDF,这将在 Amazon RDS 或 Aurora 之类的东西上是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多