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

 更新时间:2017年10月18日 08:57:48   作者:Kerrigeng  
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中使用jdbc连接数据库中文出现乱码的问题

    关于Java中使用jdbc连接数据库中文出现乱码的问题

    这篇文章主要介绍了关于Java中使用jdbc连接数据库中文出现乱码的问题,默认的编码和数据库表中的数据使用的编码是不一致的,如果是中文,那么在数据库中执行时已经是乱码了,需要的朋友可以参考下
    2023-04-04
  • SpringMVC中Model和ModelAndView的EL表达式取值方法

    SpringMVC中Model和ModelAndView的EL表达式取值方法

    下面小编就为大家分享一篇SpringMVC中Model和ModelAndView的EL表达式取值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Sping Security前后端分离两种实战方案

    Sping Security前后端分离两种实战方案

    这篇文章主要介绍了Sping Security前后端分离两种方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Component-Scan 不扫描jar里面的类问题

    Component-Scan 不扫描jar里面的类问题

    这篇文章主要介绍了Component-Scan 不扫描jar里面的类问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java实现简单点赞功能

    java实现简单点赞功能

    这篇文章主要为大家详细介绍了java实现简单点赞功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java接口方法默认静态实现代码实例

    Java接口方法默认静态实现代码实例

    这篇文章主要介绍了Java接口方法默认静态实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Spring Boot项目传参校验的最佳实践指南

    Spring Boot项目传参校验的最佳实践指南

    有参数传递的地方都少不了参数校验,在web开发中前端的参数校验是为了用户体验,后端的参数校验是为了安全,下面这篇文章主要给大家介绍了关于Spring Boot项目传参校验的最佳实践,需要的朋友可以参考下
    2022-04-04
  • Maven在Java8下如何忽略Javadoc的编译错误详解

    Maven在Java8下如何忽略Javadoc的编译错误详解

    这篇文章主要给大家介绍了关于Maven在Java8下如何忽略Javadoc的编译错误的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Java ResourceBundle案例详解

    Java ResourceBundle案例详解

    这篇文章主要介绍了Java ResourceBundle案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringMVC异常处理知识点总结

    SpringMVC异常处理知识点总结

    在本篇文章里小编给大家整理的是关于SpringMVC异常处理相关知识点内容,需要的朋友们学习下。
    2019-10-10

最新评论