Java解析DICOM图之如何获得16进制数据详解

  

  

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

  

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

  

癑ava解析DICOM图之如何获得16进制数据详解"

  

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

  

        进口java.io.File;   进口java.io.FileInputStream;   进口java.io.FileNotFoundException;   进口java.io.IOException;      公开课My_DICOM {      静态FileInputStream输入;   静态byte [] b;   公共静态void main (String [] args) {   尝试{   文件文件=新文件(“G:/zzz.dcm”);   输入=new FileInputStream(文件);   b=new byte [(int) file.length ());   input.read (b);   }捕捉(FileNotFoundException e) {   e.printStackTrace ();   }捕捉(IOException e) {   e.printStackTrace ();   }   init ();   }   公共静态孔隙init () {   System.out.println (“b.length=" + b.length);   for (int i=0; i<10000;我+ +){   [我]System.out.print (Integer.toHexString (b));   如果(我% 16==15){   System.out.println ();   其他}{   system . out。打印(",");   }   }   }   }      

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

  

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

  

问题出现了。
  

  

运行后:
  

  

癑ava解析DICOM图之如何获得16进制数据详解"

  

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

  

  

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

  

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

  

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

  

        公共静态孔隙init () {   System.out.println (“b.length=" + b.length);   for (int i=0; i<10000;我+ +){   如果(b[我]& lt; 0) {   int temp=b[我]+ 256;   System.out.print (Integer.toHexString(临时));   其他}{   [我]System.out.print (Integer.toHexString (b));   }      如果(我% 16==15){   System.out.println ();   其他}{   system . out。打印(",");   }   }   }      

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
  

Java解析DICOM图之如何获得16进制数据详解