一、.pgr是什么?

.pgr文件是二进制的图像文件,可以用普通的文本文件打开,或者查看十六进制的文本信息;

读取需要了解~~~非常重要 !!!

  • 基本数据类型的大小端存储模式
  • 表头Header

详细信息可参考:http://www.powergrep.com/manual/PowerGREP.pdf

二、C++与Java存储数据差别——大小端模式

Java是大端模式,C是小端模式;

以int为类,大端模式:高位存高位,低位存地位;
小端模式:高位存地位,地位存高位

  • 如 大端:ABCD 小端:DCBA

float,double存储为 符号位,指数位,小数位,更复杂一些;

三、Java读取小端模式数据示例代码

  • 可以用BufferTest
  • 利用移位方法
import java.nio.ByteBuffer;
import java.nio.ByteOrder;/************************************** Class Name: doubleConvert* Description:〈大小端转换〉* @create 2020/8/19* @since 1.0.0************************************/
public class doubleConvert {/*** 向将bytes添加到另一个bytes结尾,并返回位置** @param buff 目标数组* @param pos  目标数组放置的起始位置* @param lens 添加的长度* @param dx   要添加的数组* @return lens添加的长度*/public static int addToBuff(byte[] buff, int pos, int lens, byte[] dx) {System.arraycopy(dx, 0, buff, pos, lens);return lens;}/*** 获得bytes的一段数据** @param buff     原byte数组* @param startPos 起始位置* @param lenth    获取的长度* @return 返回获得的byte数组*/public static byte[] getFromBuff(byte[] buff, int startPos, int lenth) {byte[] bytes = new byte[lenth];System.arraycopy(buff, startPos, bytes, 0, lenth);return bytes;}/*** double转byte数组,小端模式** @param d* @return*/public static byte[] doubleToBytes_Little(double d) {long l = Double.doubleToLongBits(d);byte b[] = new byte[8];b[7] = (byte) (0xff & (l >> 56));b[6] = (byte) (0xff & (l >> 48));b[5] = (byte) (0xff & (l >> 40));b[4] = (byte) (0xff & (l >> 32));b[3] = (byte) (0xff & (l >> 24));b[2] = (byte) (0xff & (l >> 16));b[1] = (byte) (0xff & (l >> 8));b[0] = (byte) (0xff & l);return b;}/*** double转byte数组,大端模式** @param d* @return*/public static byte[] doubleToBytes_Big(double d) {long l = Double.doubleToLongBits(d);byte b[] = new byte[8];b[0] = (byte) (0xff & (l >> 56));b[1] = (byte) (0xff & (l >> 48));b[2] = (byte) (0xff & (l >> 40));b[3] = (byte) (0xff & (l >> 32));b[4] = (byte) (0xff & (l >> 24));b[5] = (byte) (0xff & (l >> 16));b[6] = (byte) (0xff & (l >> 8));b[7] = (byte) (0xff & l);return b;}/*** byte数组转double** @param bytes        8位byte数组* @param littleEndian 是否是小端模式* @return*/public static double bytesToDouble(byte[] bytes, boolean littleEndian) {ByteBuffer buffer = ByteBuffer.wrap(bytes, 0, 8);if (littleEndian) {// ByteBuffer.order(ByteOrder) 方法指定字节序,即大小端模式(BIG_ENDIAN/LITTLE_ENDIAN)// ByteBuffer 默认为大端(BIG_ENDIAN)模式buffer.order(ByteOrder.LITTLE_ENDIAN);}long l = buffer.getLong();return Double.longBitsToDouble(l);}/*** long转byte数组,小端模式** @param l* @return*/public static byte[] longToBytes_Little(long l) {byte b[] = new byte[8];b[7] = (byte) (0xff & (l >> 56));b[6] = (byte) (0xff & (l >> 48));b[5] = (byte) (0xff & (l >> 40));b[4] = (byte) (0xff & (l >> 32));b[3] = (byte) (0xff & (l >> 24));b[2] = (byte) (0xff & (l >> 16));b[1] = (byte) (0xff & (l >> 8));b[0] = (byte) (0xff & l);return b;}/*** long转byte数组,大端模式** @param l* @return*/public static byte[] longToBytes_Big(long l) {byte b[] = new byte[8];b[0] = (byte) (0xff & (l >> 56));b[1] = (byte) (0xff & (l >> 48));b[2] = (byte) (0xff & (l >> 40));b[3] = (byte) (0xff & (l >> 32));b[4] = (byte) (0xff & (l >> 24));b[5] = (byte) (0xff & (l >> 16));b[6] = (byte) (0xff & (l >> 8));b[7] = (byte) (0xff & l);return b;}/*** byte数组转long** @param bytes        8位的byte数组* @param littleEndian 是否是小端模式* @return* @throws Exception*/public static long bytesToLong(byte[] bytes, boolean littleEndian) throws Exception {if (bytes.length != 8) {throw new Exception("参数错误,无法解析。");}ByteBuffer buffer = ByteBuffer.wrap(bytes, 0, 8);if (littleEndian) {// ByteBuffer.order(ByteOrder) 方法指定字节序,即大小端模式(BIG_ENDIAN/LITTLE_ENDIAN)// ByteBuffer 默认为大端(BIG_ENDIAN)模式buffer.order(ByteOrder.LITTLE_ENDIAN);}return buffer.getLong();}/*** int转byte数组  ,小端** @param num* @return*/public static byte[] intToBytes_Little(int num) {byte[] result = new byte[4];result[0] = (byte) ((num >>> 0) & 0xff);result[1] = (byte) ((num >>> 8) & 0xff);result[2] = (byte) ((num >>> 16) & 0xff);result[3] = (byte) ((num >>> 24) & 0xff);return result;}/*** int转byte数组 ,大端** @param num* @return*/public static byte[] intToBytes_Big(int num) {byte[] result = new byte[4];result[0] = (byte) ((num >>> 24) & 0xff);result[1] = (byte) ((num >>> 16) & 0xff);result[2] = (byte) ((num >>> 8) & 0xff);result[3] = (byte) ((num >>> 0) & 0xff);return result;}/*** byte数组转int,小端** @param bytes* @return*/public static int bytesToInt_Little(byte[] bytes) {int result = 0;if (bytes.length == 4) {int a = (bytes[0] & 0xff) << 0;int b = (bytes[1] & 0xff) << 8;int c = (bytes[2] & 0xff) << 16;int d = (bytes[3] & 0xff) << 24;result = a | b | c | d;}return result;}/*** byte数组转int,大端** @param bytes* @return*/public static int bytesToInt_Big(byte[] bytes) {int result = 0;if (bytes.length == 4) {int a = (bytes[0] & 0xff) << 24;int b = (bytes[1] & 0xff) << 16;int c = (bytes[2] & 0xff) << 8;int d = (bytes[3] & 0xff) << 0;result = a | b | c | d;}return result;}/*** byte数组转十六进制** @param bytes* @return*/public static String bytesToHex(byte[] bytes) {StringBuilder buf = new StringBuilder(bytes.length * 2);for (byte b : bytes) { // 使用String的format方法进行转换buf.append(String.format("%02x", new Integer(b & 0xff)));}return buf.toString();}/*** 十六进制转byte数组** @param str* @return*/public static byte[] hexToBytes(String str) {if (str == null || str.trim().equals("")) {return new byte[0];}byte[] bytes = new byte[str.length() / 2];for (int i = 0; i < str.length() / 2; i++) {String subStr = str.substring(i * 2, i * 2 + 2);bytes[i] = (byte) Integer.parseInt(subStr, 16);}return bytes;}public static void main(String[] args) throws Exception {int num = 100;// 先将int 转小端的byte[], 小端的byte[] 再转回intSystem.out.println("intToLittle: " + bytesToInt_Little(intToBytes_Little(num)));// 先将int 转大端的byte[], 大端的byte[] 再转回intSystem.out.println("intToBig: " + bytesToInt_Big(intToBytes_Big(num)));long l = 9l;System.out.println("longToLittle: " + bytesToLong(longToBytes_Little(l), true));System.out.println("longToBig: " + bytesToLong(longToBytes_Big(l), false));double d = 9.125d;System.out.println("doubleToLittle: " + bytesToDouble(doubleToBytes_Little(d), true));System.out.println("doubleToBig: " + bytesToDouble(doubleToBytes_Big(d), false));System.out.println("doubleToLittle---Hex: " + bytesToHex(doubleToBytes_Little(d)));System.out.println("doubleToBig---Hex: " + bytesToHex(doubleToBytes_Big(d)));}
}

结果如下:

.pgr照片文件解析,C++与Java存储数据差别大小端模式相关推荐

  1. 计组之数据运算:8、c语言之强制类型转化、数据的存储与排序(大小端、字节对齐)

    8.c语言之强制类型转化 数据的存储与排序 大小端模式 边界对齐 数据的存储与排序 大小端模式 边界对齐

  2. java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储

    java 存储数据到文件中 动机 所有这一切始于意识到我买不起足够大的计算机. 音频处理需要大量的内存. Audacity是一款出色的免费音频处理器,它使用文件支持的存储系统对其进行管理. 这是解决此 ...

  3. java大小端模式_深入浅出: 大小端模式

    Writer      :BYSocket(泥沙砖瓦浆木匠) 一.什么大小端? 大小端在计算机业界,Endian表示数据在存储器中的存放顺序.百度百科如下叙述之: 大端模式,是指数据的高字节保存在内存 ...

  4. 高地址和低地址、高字节低字节、大小端模式的转换,存储顺序

    参考博客 https://blog.csdn.net/ce123_zhouwei/article/details/6971544 https://my.oschina.net/alphajay/blo ...

  5. 数据在内存中的大小端模式存储

    大端模式:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中. 小端模式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中. 因为在计算机系统中,我们是以字节为单 ...

  6. 高地址和低地址、高字节低字节、大小端模式(及如何互换),存储顺序(!!)

    参考博客 https://blog.csdn.net/ce123_zhouwei/article/details/6971544 https://my.oschina.net/alphajay/blo ...

  7. 【濡白的C语言】数据的存储(大小端模式,原码反码补码,浮点数的存储,浮点型精度缺失的原因)

    前言 很多学习C语言之后就会对各种类型感到很烦,但是数据的类型具有相当的意义.首先是类型决定了大小,即该数据在内存中开辟的空间大小:同时不同的类型还决定了数据存储的方式,相同的数据,存入整形与浮点型方 ...

  8. 本机速度文件支持的“纯” Java大数据存储

    动机 所有这一切始于意识到我买不起足够大的计算机. 音频处理需要大量的内存. Audacity是一款出色的免费音频处理器,它使用文件支持的存储系统对其进行管理. 这是解决此类问题的常用方法,在这些问题 ...

  9. java将输出结果写入csv文件_如何在Java中将数据写入.csv文件?

    名为OpenCSV的库提供API来从.CSV文件读取数据或将数据写入.CSV文件.此处说明了如何使用Java程序写入.csv文件的内容. Maven依赖 com.opencsv opencsv 4.4 ...

最新文章

  1. matlab中tecdem,TopoToolbox: A set of Matlab functions for topographic analysis
  2. JZOJ 5933. 【NOIP2018模拟10.27】百鸽笼
  3. ABAP 并发执行的威力
  4. 前端请求后端数据的三种方式
  5. 用 Doc2Vec 得到文档/段落/句子的向量表达
  6. 百万级别长连接,并发测试指南
  7. 史上最详细的Studio教程二来啦
  8. linux系统可以安装Adobe,Ubuntu 64位安装Adobe Reader 9.5.5
  9. ubuntu stardict词典安装
  10. 修改了Excel默认打开方式后仍然使用WPS打开的解决办法
  11. pr基本剪辑操作/视频导出操作
  12. 计算文件的md5值(Vue)
  13. Google Drive(谷歌网盘)下载超大文件方法
  14. 用户运营4大策略体系搭建:增长框架+用户建模+场景化分层+数据运营
  15. 基于JNA(Java Native Access)实现RFID单卡、多卡读取以及写入。
  16. 如视VR显示连不上服务器,HTC Vive播放本地视频图文教程(附常见问题解决办法)...
  17. php - 解决百万级全站用户消息推送问题
  18. oracle树结构统计,Oracle树形统计--子节点汇总到父节点
  19. ubuntu系统vim常用命令学习以及ubuntu软件下载安装
  20. Autofac实现依赖注入

热门文章

  1. 【嵌入式】openmv与stm32的串口通信
  2. HarmonyOS shape 的使用
  3. Android 绘制同心圆 (2个圆叠加在一起)
  4. Java 二进制,八进制,十进制,十六进制
  5. Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin
  6. 【高精度】被限制的加法
  7. css 定位及遮罩层小技巧
  8. 2022-2028年中国化学纤维行业市场研究及前瞻分析报告
  9. BZOJ4292 : [PA2015]Równanie
  10. oracle创建DBLink连接