mariadb/mysql:如何将BLOB的一部分转换/解包为整数或双精度等

mariadb/mysql:如何将BLOB的一部分转换/解包为整数或双精度等,mariadb,blob,unpack,Mariadb,Blob,Unpack,我使用mariaDB/mysql数据库对二进制数据的结构进行“逆向工程”。 一个名为“data”的列包含152字节长的二进制“blob” 在其他专栏中,我列出了我希望得到的信息: e、 g.col2:“时间戳”(unix格式),col3:“大小1”uint32,col4:“长度”4字节浮点。。。。等等 当我开始时,所有这些列都包含NULL 现在我写了一篇论文:“data”中blob的字节8:12是一个4字节的int,并解码为“size1”,以此类推。 为了评估我的论文,我想在col3/“size

我使用mariaDB/mysql数据库对二进制数据的结构进行“逆向工程”。 一个名为“data”的列包含152字节长的二进制“blob”

在其他专栏中,我列出了我希望得到的信息: e、 g.col2:“时间戳”(unix格式),col3:“大小1”uint32,col4:“长度”4字节浮点。。。。等等

当我开始时,所有这些列都包含NULL

现在我写了一篇论文:“data”中blob的字节8:12是一个4字节的int,并解码为“size1”,以此类推。 为了评估我的论文,我想在col3/“size1”中填入从“data”中的blob中提取的内容

所以我现在需要的是一个SQL(mariadb)更新,它从blob中提取字节并将其存储在“col3”中。 其中一列称为“脉冲最大值”。这样做很好,因为我只需要1个字节:

更新字典2 设置脉冲_max=ascii(子串(数据,147,1))

但是如何将blob的较大部分(2、4字节等)转换为int、uint、double、unixtimestap等。? 像这样的东西失败了:(列“tracklenght”是一个4字节的uint。)

更新字典2设置tracklength=binary(子字符串(数据,113,4));

==>警告:#1366 Falscher integer Wert:“\x94L\xFEE”für Feld“tracklength”在Zeile 1中

更新字典2设置持续时间\u time=CONV(反向(十六进制(子字符串(数据,109,4))),16,10);

==>这是胡说八道(我的源数据是little endian)。可能4个字节的顺序不对

我知道我可以用C/perl/python/etc(htonl、unpack等)完成所有这些工作,但是这些程序不允许我存储很多数据样本,也不允许对我的论文进行大量评估


当然,我可以使用python/perl mariadb连接器。但是,我希望直接在SQL中执行,并将例程存储在数据库中。

好吧,我有几篇文章要写。我把它们全部删除了,因为现在我有了一个不错的解决方案。我希望有一个集成的“函数”“通过SQL/mariadb。事实并非如此,所以我自己写了。如果您正在寻找类似的解决方案,您可以:

如果存在DROP功能,请打开F4; 分隔符//
创建函数uncapf4(b BLOB(4))
返回浮点值
开始
声明f_值浮动
声明binstrchar(32)
将binstr=LPAD(CONV(十六进制)(CAST)(反向(b))设置为CHAR(10000)字符集 utf8),16,2),32,'0'); 设置f_值=
功率(-1,CONV(子串(binstr,1,1,2,10))*
功率(2,CONV)(子串(binstr,2,8,2,10)-127)*
(1+CONV(子串(binstr,10,23),2,10)/POW(2,23))
返回f_值
结束//
定界符

使用此函数,可以简单地将blob列“转换/解包”为float32(类似于double64):

更新字典2 SET tracklength=UNCAPF4(子字符串(数据,113,4))


显然,数据是blob列,tracklenght是float列。

欢迎使用堆栈溢出。请学习如何使用堆栈溢出,并阅读如何提高问题的质量。然后,你的问题包括完整的源代码,你有作为一个,这可以由别人测试。有关SQL相关问题,请参见。