日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .pgr照片文件解析,C++与Java存储数据差别大小端模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、.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存储数据差别大小端模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。