用mysql原生函数进行字节顺序转换
Posted
技术标签:
【中文标题】用mysql原生函数进行字节顺序转换【英文标题】:Byte order conversion with mysql native function 【发布时间】: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++的。 【参考方案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 之类的东西上是不可能的。
【讨论】:
以上是关于用mysql原生函数进行字节顺序转换的主要内容,如果未能解决你的问题,请参考以下文章
linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换