实现Linux下od -tx -tc XXX的功能

实现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的内容,默认以四字节为一组显示。

1047583-20180610233722050-2074871017.png

od -tc File输出字节对应的ASCII值

1047583-20180610233733486-421201454.png

题目中od -tx -tc File是先在以十六进制输出File文件内容的同时,输出字节对应的ASCII值,它与od -tc -tx File的区别在于输出的次序

1047583-20180610233745419-1252849741.png

三、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 );
        }
    }
}

1047583-20180610233804934-1711850051.png

1047583-20180610233821807-1004619092.png

转载于:https://www.cnblogs.com/cxgg/p/9165062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值