java讀二進制文件中結構體,java讀取二進制文件內容

本文目錄一覽:

如何通過java從二進制文件中讀取以前用c寫入的一個結構體

java是沒有一種叫做struct 結構的東西可以讓你用 fread 一次性就把裡面的元素都填充上的。所以你要自己做分析了。

比如你的結構是100字節的

struct

{

int k;

char p[96];

}

java從一個文件讀出這個100字節的快,然後在自己在程序中這個塊的頭四個字節就是一個整數所以

整數buf[0] + buf[1]*256+ buf[2] * 256*256 + buf[3]*256*256*256;

在JAVA和安卓中如何定義一個結構體或者其他的辦法幫我實現這個結構體,進行數據的讀和寫

定義一個類對象就行了:

public class CookerPara{

public int    AA1;

public int    AA2;

public int    ErrorSt;   

public int   Power;    

public int   Cur;      

public int   PanTemp;   

public int   IGBTTemp; 

public int    Madj;     

public int   Padj;     

public int   Voltage;  

public int   OnTime;   

public int   CapTemp;   

public int   Capture;

public int   PhaseMove; 

public int   DeadTime;  

public int   Capture2; 

}

我有一個c++的二進制文件,結構體是2個int類型,怎麼用java讀出裡面每個字段的值

教你一個方法,通過修改結構體內的數確定出兩個int的存儲位置,然後用Java讀取文件的函數讀取那兩個四字節保存在Java的類型中。

Java中類似C語言中的結構體怎麼寫?怎麼把結構體的數據寫到二進制文件中去?

java中用類代替了C語言的結構體

java.io包里有個相應的類,可以把任何類寫到文件中去,相關的有

ObjectOutputStream 和 FileOutputStream,自己去看吧

Java能否像C語言那樣讀文件一行字符串到結構體變量中,以實現對結構體內的變量自動賦值?

有;

JSON可以。

你那C的函數也是別人封裝好的,只不過你這麼一調用,看似簡單。

將對象通過gson轉為JSON串寫入文件里;

讀取文件里的內容,轉為字符串,再把這些字符串用GSON轉為對象Object,再將Object強轉為Student賦給一個變量 或 直接調用即可。

以上兩個方法,自己寫好封裝成fRead()、fWrite(),也能看似很簡單的樣子。

需要用到gson的jar包,可以搜索下載試試

例如有個對象Student student;想轉為字符串 String str;

str = new GsonBuilder().create().toJson(student);

下面再將str反轉回為newStudent 對象

Student newStudent = (Student)new GsonBuilder().create().fromJson(str,Student.class);

如何用Java或C語言解析二進制文件為文本文件?

在學習C語言fopen()函數後,知道它的第二個參數是標誌字符串。如果字符串中出現’b’,則表明是以打開二進制(binary)文件,否則是打開文本文件。

那麼什麼是文本文件,什麼是二進制文件呢?

從文件編碼的方式來看,文件可分為ASCII碼文件和二進制碼文件兩種。

ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應一個字節,用於存放對應的ASCII碼。例如,數5678的存儲形式為:

ASC碼: 00110101 00110110 00110111 00111000

↓ ↓↓  ↓

十進制碼: 5 678

共佔用4個字節。ASCII碼文件可在屏幕上按字符顯示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內容。 由於是按字符顯示,因此能讀懂文件內容。

二進制文件是按二進制的編碼方式來存放文件的。例如,數5678的存儲形式為:00010110 00101110隻佔二個字節。二進制文件雖然也可在屏幕上顯示,但其內容無法讀懂。C系統在處理這些文件時,並不區分類型,都看成是字符流,按字節進行處理。輸入輸出字符流的開始和結束只由程序控制而不受物理符號(如回車符)的控制。因此也把這種文件稱作“流式文件”。

文本文件與二進制文件的區別在系統存儲上它們實際上並沒有什麼區別,都是以二進制的方式存儲於硬盤上。之所以分二進制文件和文本文件,主要是邏輯上的區分,文本文件更人為可讀而已。站在編程的角度看,文本文件是基於字符編碼過後的,比如常見的就有ascii編碼,gbk編碼,unicode編碼等,文本工具直接打開人為可讀。而二進制文件是基於值的編碼,這個值到底是什麼,完全可自定義,所以可以說二進制文件是一種特殊編碼的文件。如果用java編程,可能就根本沒遇到過以二進制打開和文本文件打開這兩種方式。java裡面有字符流和字節流,字符流是對字節流的封裝,有編碼解碼,而字節流操作的則是byte數組,所以更容易理解。python的文件讀寫方式則更貼近C。因為python和java他們底層都是C,所以很有必要弄清C的讀寫文件方式。

在Windows和DOS系統中,狹義的文本文件是指擴展名為txt的文件。實際上,那些沒有規定格式的,由可理解的的ASCII以及其他編碼文字組成的文件都是文本文件,如C源程序文件,HTML超文本,XML。除此之外的其他文件都是二進制文件,如Word文件DOC,圖象格式文件JPG。

實際上,fopen()的 b 標誌不但可以打開二進制文件,還可以打開文本文件,同樣,不帶 b 標誌也可以打開文本文件。

既然這樣,為什麼還要區分兩種打開方式呢?

因為這兩種方式在讀寫文件時的操作是不一樣的。

二進制方式很簡單,讀文件時,會原封不動的讀出文件的全部內容,寫的時候,也是把內存緩衝區的內容原封不動的寫到文件中。

而文本方式就不一樣了,在寫文件時,會將換行符號CRLF(0x0D 0x0A)全部轉換成單個的0x0A,並且當遇到結束符CTRLZ(0x1A)時,就認為文件已經結束。相應的,寫文件時,會將所有的0x0A換成0x0D0x0A。

所以,若使用文本方式打開二進制文件時,就很容易出現文件讀不完整,或內容不對的錯誤。即使是用文本方式打開文本文件,也要謹慎使用,比如複製文件,就不應該使用文本方式。

要特別注意的是,上面這樣的說法僅適用於DOS和Windows系統。在Unix和其他一些系統中,沒有文本方式和二進制方式的區分,使不使用’b’標誌都是一樣的。這是由於不同操作系統對文本文件換行符的定義,和C語言中換行符的定義有所不同而造成的。

如上文已提到,DOS和Windows系統使用CRLF(0x0D 0x0A)即\r\n雙字節作為文本文件換行符,而Unix文本文件的換行符只有一個字節LF(0x0A)為。在C語言中,也是以LF即’\n’為換行符。

由於DOS/Windows定義的換行符和C語言的不一致,C語言的標準輸入輸出函數適行讀寫文本文件時,就適行了CRLF-LF的轉換。而Unix的定義和C語言的是一樣的,就不必轉換了。

那麼,為什麼會有定義不一致的情況呢,這純屬歷史原因。當初C是在Unix上發展的,對換行的定義自然就一樣了。其後C被引入到DOS系統,為了使原有的C程序能不加修改的讀寫DOS的文本文件,所以就在文件讀寫上做了修改。隨着DOS/Windows成為主流平台,這個當初為了兼容而做的修改給眾多的C語言開發者添了這樣一個小小的麻煩。

所以,二進制和文本模式的區別就在於對於換行符和一些非可見字符上面的轉化,所以安全起見,是使用二進制讀取會比較安全一些。

原創文章,作者:ILJW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/150278.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ILJW的頭像ILJW
上一篇 2024-11-07 09:50
下一篇 2024-11-07 09:50

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論