本文目錄一覽:
- 1、如何通過java從二進制文件中讀取以前用c寫入的一個結構體
- 2、在JAVA和安卓中如何定義一個結構體或者其他的辦法幫我實現這個結構體,進行數據的讀和寫
- 3、我有一個c++的二進制文件,結構體是2個int類型,怎麼用java讀出裏面每個字段的值
- 4、Java中類似C語言中的結構體怎麼寫?怎麼把結構體的數據寫到二進制文件中去?
- 5、Java能否像C語言那樣讀文件一行字符串到結構體變量中,以實現對結構體內的變量自動賦值?
- 6、如何用Java或C語言解析二進制文件為文本文件?
如何通過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-hk/n/150278.html