jpeg 字节到十六进制值

jpeg bytes to hex value

我正在通过 uvc 接收流,它为我提供了每个 mjpeg 流。

将jpeg帧写入位图时,从调试器查看的字节数组如下所示:

{ 0, -128, 1, -128, 0, -128, .......}

我是这样创建文件的:

bitmap.copyPixelsFromBuffer(frame);
File file = new File(Constants.CAPTURE_PATH, System.currentTimeMillis() + ".jpeg");
file.createNewFile();
out = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);

创建文件并使用十六进制查看器查看文件后,文件如下所示:

FF D8 FF E0 00.....

这是不是意味着{0}变成了FF,{-128}变成了D8?

是什么规则造成的?任何帮助将不胜感激。

您可能正在查看 JPEG 文件 header 如果这些是文件十六进制查看器看到的文件中最开始的字节。 FF D8 FF 看起来惊人地相似。参见 here for example and wikipedia page here

我希望您在调试器中查看的数据是原始 image 数据,不包括 header.

经过我们在评论中的简短交谈,我觉得这就是您正在寻找的信息。

您实际看到的是文件header。 header 本质上是文件开头的一段代码,它告诉计算机它是什么,以便它知道如何处理它。

有关文件 header 的更多信息:https://www.webopedia.com/TERM/H/header.html

现在,针对您的具体问题。对于 jpeg(就像任何其他文件一样),它们有自己的 header 和数据组织方式。 JPEG header 以 FF D8 开头,对于 jpeg 文件 reader 表示 SOI(图像开始)。然后它转到 FF E0,这意味着 APP0(应用程序段)。清单还在继续。

关于 jpeg 文件的更多信息:https://web.archive.org/web/20120403212223/http://class.ee.iastate.edu/ee528/Reading%20material/JPEG_File_Format.pdf

您需要做的是跳过 header 并开始寻找您的 "actual" 数据。 jpeg 文件 headers 有点棘手的部分是它们的大小不尽相同,因此如果我没记错的话,您需要寻找 SOS(扫描开始)标记并从那里开始。