我们正在尝试从专有的声纳日志文件格式中提取声纳数据,这种格式在大多数情况下都运行良好。数据以二进制形式存储,其可变长度的标头包含诸如深度,地理位置等信息,并且返回原始声纳的字节数组。我们使用这种格式的大多数示例都有一个简单的字节数组,其中每个字节都是原始声纳返回电平。使用这些值和单色8位调色板创建位图,将使您直观地了解声纳,就像在回声测深仪屏幕上看到的那样。以相同方式声纳ping数据。这些文件显然是以“低质量”设置记录的,并且已经进行了某种压缩。标头可以像以前一样可读。块长度是指ping数组+标头的大小。在这种情况下,标头的长度为28个字节-但直到下一行的间隙仅为372个字节。这表明压缩是固定的,并且每个文件编码的字节产生4个最终字节。

这里是此压缩字节数组中一个块的示例。该示例的前两个字节不是字节数组的一部分,但可能很重要。在此文件的未压缩版本上,此数字为-1。在压缩版本中,每个ping都有一个不同的数字。

任何建议或指示如何进行将非常热烈。以防万一它有帮助,这是非常典型的ping操作,在开始时包含一簇非零值(表面噪声),然后包含很多零或非常低的值,然后从返回值中包含一些更重要的值底部信号。

67 7F 42 46 3D 35 3C 53 3B 40 80 40 36 41 3A
53 3F 3F 40 40 80 40 40 81 40 47 40 40 40 3D 51
3E 40 40 40 40 40 40 81 40 89 40 3B 43 3F 40 40
40 40 40 80 3E 46 3F 41 3E 41 40 40 40 40 80 40
40 40 40 40 80 40 81 40 80 40 95 3F 42 40 40 40
40 40 40 40 40 40 40 40 40 40 40 40 40 40 3F 46
40 40 40 41 40 40 40 40 40 40 40 40 40 40 40 40
40 40 40 40 40 40 80 40 40 40 40 40 40 40 40 84
40 90 40 9F 40 3F 40 40 40 40 40 40 40 40 40 40
40 40 40 40 40 40 81 40 40 40 40 40 40 40 80 40
40 40 40 81 40 81 40 80 40 44 40 40 40 40 80 40
40 40 80 40 40 80 40 80 40 40 40 81 40 40 40 82
40 40 40 80 40 81 40 83 40 80 40 40 83 40 80 40
40 80 40 80 40 80 40 40 80 40 88 40 84 40 E6 40
40 40 40 40 40 40 83 40 80 40 40 80 40 40 40 40
80 40 40 40 82 40 40 40 40 40 40 80 40 40 40 80
40 40 85 40 81 40 40 81 40 81 40 82 40 88 40 40
80 40 80 40 40 40 42 83 40 40 40 81 40 80 40 80
40 40 80 40 40 80 40 80 40 40 80 40 80 40 40 80
40 80 40 80 40 40 40 84 40 40 40 40 86 40 40 40
AC 40 93 40 FF E9 40 40 40 40 40 80 40 40 40 40
80 40 40 82 40 87 40 82 40 83 40 40 80 40 80 40
8B 40 40 8B 40 82 40 86 40 8D 40 91 40 93 40 81
40 86 40 88 40 42 00 


编辑以添加:“ compressed”可能不是这个正确的术语(上面的文件片段肯定没有被所有这些相似的值压缩)。我猜这可能只是某种编码类型,并且可能有损-这就是为什么将该选项称为“低质量”的原因。这里也可能每个字节仅需要两个字节-我们不确定100%。不过,这并不比蚕食明显。同样,这将被实时记录在没有大量处理能力的旧硬件单元上。因此,我怀疑它是否花哨。 br />
我的错-我没有从原始示例中删除结尾的34个字节-现在,我已经删除了,这34个字节是下一个标头和下一个ping的前6个字节。我已经更新了原始字节。

有关文件格式的更多信息:


文件以不重复的8个字节开头,包含在此标头中是一个短文件,表示文件的行长。
每行的标头的长度可以变化-标头中的第一个字段之一是位掩码,它指示要读取的字段。在此特定文件中,标头为28个字节-但实际上,包括数据在内,行与行之间可以变化。
ping数据大小(以文件字节为单位)是文件级行大小减去标头长度。
我们知道标题已经排序,因为我们可以获得合法的纬度,经度,时间(毫秒偏移)和深度信息。我们可以使用此文件中的数据来绘制轨迹。
我将回到想法,我们认为这些字节扩展为1600字节-我们不确定,这可能是一个红色鲱鱼。我们确实知道观察到的ping大于372字节,并且该文件是以“低质量”记录的。
我们可以使用显示该文件的查看应用程序,但只能将其显示为屏幕上的图像。我们无法获得原始字节输出以进行比较。上面示例中的ping是非常典型的-中间的0x40和0x80值的大簇很可能是零值或接近零值。
显示此编码的文件的8值具有1024(十进制)字节文件头,其中未显示此编码的文件为零。很高兴向有兴趣的任何人提供文件和查看器应用程序(免费软件-不是我们的)。

评论

我正在努力使这个想法成为现实。块应该是1600个字节。您说“到下一行的距离是372”。您如何知道下一行何时开始?它是否具有您可以识别的另一个标头? 372 + 28 = 400字节因此1个块由四个400bytes节组成?您发布了一个“块”,但它的408字节似乎与4 x 400字节不匹配。有机会再详细一点。也许在某种内存/字节映射中?查看数据(并绘制快速直方图),看起来没有足够随机的地方可以压缩。是什么让您如此确定呢?

好吧,我应该澄清一下。 1.我认为您是对的-正如我在对OP所做的编辑中提到的那样,我认为压缩在这里是错误的术语。字节以某种方式编码,因此文件中的每个字节都包含2个或更多最终字节的数据。该文件的记录器告诉我,“ 1600”参考是他在进行记录时将“ ping大小”设置为。对于具有正常编码的ping数据的文件,此“ ping大小”字段实际上是指整行,其中包括标题+ ping。标头长度是可变的,其余部分由ping决定。在这种情况下,整行占用400个字节。

我对OP进行了编辑,以从末尾删除一些其他字节-包含错误。有372个ping字节,再加上从标头中保留的开头的2个字节,因为我认为它们可能很重要。是的-我从标题中识别了下一行。我觉得这可能是2-1编码,所以1600的东西不是一成不变的。希望能澄清(一点!)。

不知道我是否有时间,但是查看文件/应用程序会很有趣。

@Sukminder-如何获取文件?

#1 楼

不是答案,但评论变得一团糟。瞥见我还注意到,示例数据在数据的顶部和末端重复了以下顺序:标题中是否硬编码了大小?
整个文件中的深度和位置数据是否健全?在其他地方,您是否具有大约这些值?从标头知道深度,您应该能够识别出深度变化对底部ping数据的分散。指示更高的位,例如3,是某种重复计数。如果是这样,则372的最后一个0x40可能指示某种数据结束指示符。 (0x80不在其他地方,而是在下一个字节块中-末尾的34个字节)。一个示例…


如果您使用重要信息回答此评论,最好更新问题而不是在此下方评论。 (如果我离得很远或不多看,我也可以删除它……)