在最近的一个项目需要用JAVA来解析DICOM图片,并建置被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT、核磁共振、超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用,在实现中遇到一些问题下面做一些记录。
首先找一个*。dcm文件。用编辑器打开可以看到如下界面。我是用的编辑器是文本编辑器
红字标注的是字节码的标注,前面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[我])代码>将其转化成十六进制。
问题出现了。
运行后:
对照上面的编辑器打开的十六进制列表红字处本该是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。打印(","); } } }
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。