1. 程式人生 > >實現Linux下od -tx -tc XXX的功能

實現Linux下od -tx -tc XXX的功能

throw 文件內容 type info () hello cep key 找規律

實現Linux下od -tx -tc XXX的功能

一、od命令

(1)功能

od命令用於將指定文件內容以八進制、十進制、十六進制、浮點格式或ASCII編碼字符方式顯示,通常用於顯示或查看文件中不能直接顯示在終端的字符。

常見的文件為文本文件和二進制文件。od命令主要用來查看保存在二進制文件中的值,按照指定格式解釋文件中的數據並輸出。

(2)命令格式

od [<選項><參數>] [<文件名>]

(3)命令選項

-t<TYPE>:指定輸出格式,格式包括a、c、d、f、o、u和x,各含義如下:

  • a:具名字符;
  • c:ASCII字符或者反斜杠;
  • d[SIZE]:十進制,正負數都包含,SIZE字節組成一個十進制整數;
  • f[SIZE]:浮點,SIZE字節組成一個浮點數;
  • o[SIZE]:八進制,SIZE字節組成一個八進制數;
  • u[SIZE]:無符號十進制,只包含正數,SIZE字節組成一個無符號十進制整數;
  • x[SIZE]:十六進制,SIZE字節為單位以十六進制輸出,即輸出時一列包含SIZE字節。在默認條件下,以四個字節為一組輸出

二、題目分析

od -tx File是以十六進制輸出File的內容,默認以四字節為一組顯示。

技術分享圖片

od -tc File輸出字節對應的ASCII值

技術分享圖片

題目中od -tx -tc File是先在以十六進制輸出File文件內容的同時,輸出字節對應的ASCII值,它與od -tc -tx File

的區別在於輸出的次序

技術分享圖片

三、MyOD.java

import java.io.*;
public class MyOD{
    public static void main(String[] args) throws IOException {
        try (FileInputStream input = new FileInputStream("/home/darkeye/cxgg20165312/20165312/hello")) {
            byte[] data = new byte[1024];
            int i, flag;
            input.read(data);
            for (i = 0; i < 1024; i = i + 4) {
                if (i % 16 == 0) {
                    System.out.printf("\n%07o\t\t", i );
                }  //四個字節為一組,一行四組。i=16時為左側第一列(默認的地址),格式為七位八進制。
                // 通過找規律,其數值是該行第一個字符的序號值(從0到length-1)對應的的八進制數
                System.out.printf(" %02x%02x%02x%02x\t", data[i + 3], data[i + 2], data[i + 1], data[i]);
                if ((i + 4) % 16 == 0) {
                    System.out.println();
                    System.out.printf("\t  ");
                    for (int j = i - 12; j < i+4 ; j++) {
                        if ((int) data[j] == 10) {
                            System.out.printf(" \\");
                            System.out.printf("n ");
                        } else {
                            System.out.printf("  %c ", data[j]);
                        }
                    }
                }
                if (data[i+4] ==0 ) {
                    System.out.println();
                    System.out.printf("\t   ");
                    for (int j = i-i%16; data[j-3] != 0; j++) {
                        if ((int) data[j] == 10) {
                            System.out.printf(" \\");
                            System.out.printf("n  ");
                        } else {
                            System.out.printf(" %c ", data[j]);
                        }
                    }
                    break;
                }
            }
            System.out.printf("\n%07o\n", i+3 );
        }
    }
}

技術分享圖片

技術分享圖片

實現Linux下od -tx -tc XXX的功能