• 技术文章 >Java >java教程

    Java解析DICOM图获得16进制数据的实例分析

    黄舟黄舟2017-10-18 09:51:16原创776
    DICOM就是医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052),下面这篇文章主要给大家介绍了关于Java解析DICOM图之如何获得16进制数据的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

    前言

    在最近的一个项目需要用JAVA来解析DICOM图片,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用,在实现中遇到一些问题下面做一些记录。

    首先找一个*.dcm文件。用编辑器打开可以看到如下界面。我是用的编辑器是UltraEdit

    红字标注的是字节码的标注,前面8行代码是文件的头信息一般没用。从第九行开始的四个十六进制数“44,49,43,4D”是很重要的。用ASCll码解释就是DICM。表示这是一个DICOM文件,这四个16进制数如果丢失或损坏,这个DICOM图片就无法打开了。

    下面用java来读取这些十六进制数


    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class My_DICOM {
    
     static FileInputStream input;
     static byte[] b;
     public static void main(String[] args) {
      try {
       File file = new File("G:/zzz.dcm");
       input = new FileInputStream(file);
       b = new byte[(int) file.length()];
       input.read(b);
      } catch (FileNotFoundException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
      init();
     }
     public static void init(){
      System.out.println("b.length="+b.length);
      for (int i =0;i<10000;i++) {
        System.out.print(Integer.toHexString(b[i]));  
       if (i%16==15) {
        System.out.println();
       }else{
        System.out.print(", ");
       }
      }
     }
    }

    (因为文件太大有13万个字节,所以为了展示只循环1万次。读取前一万个字节)

    上面的代码很普通就是将文件流读入byte数组中。用Integer.toHexString(b[i])将其转化成十六进制。

    问题出现了。

    运行后:

    对照上面的编辑器打开的十六进制列表红字处本该是a6可是却打印出了ffffffa6。

    查找问题

    笔算出错字节所在的位置是140。打印system.out.pritln(b[140]);结果是-90。为什么是-90?。

    反向推到a6转化为十进制应该是166。

    好了这些找到问题了。166+90=256这不是巧合。忽略了一个问题就是byte数组的最大值只有127.所以文件中读到的数组大于127时byte数组的读取就会出错。

    解决方法


    public static void init(){
      System.out.println("b.length="+b.length);
      for (int i =0;i<10000;i++) {
      if (b[i]<0) {
        int temp=b[i]+256;
        System.out.print(Integer.toHexString(temp));
       }else{
        System.out.print(Integer.toHexString(b[i]));
       }
    
       if (i%16==15) {
        System.out.println();
       }else{
        System.out.print(", ");
       }
      }
     }

    总结

    以上就是Java解析DICOM图获得16进制数据的实例分析的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:DICOM Java 进制
    上一篇:Java实现背包问题求解的实例代码 下一篇:Java中对于常用命令的汇总

    相关文章推荐

    • 动态代理的两种方式是什么• JAVA-5NIO之Selector• 基于Android 监听ContentProvider 中数据变化的相关介绍• java提高篇(六)-----关键字static• java提高篇(七)-----详解内部类

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网