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 NumberFormat格式化float类型的bug
今天小编就为大家分享一篇关于Java NumberFormat格式化float类型的bug,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-10-10
使用spring oauth2框架获取当前登录用户信息的实现代码
这篇文章主要介绍了使用spring oauth2框架获取当前登录用户信息的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07
Java 中 Date 与 Calendar 之间的编辑与转换实例详解
这篇文章主要介绍了Java 中 Date 与 Calendar 之间的编辑与转换 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下2018-07-07
Mybatis-Plus处理Mysql Json类型字段的详细教程
这篇文章主要给大家介绍了关于Mybatis-Plus处理Mysql Json类型字段的详细教程,Mybatis-Plus可以很方便地处理JSON字段,在实体类中可以使用@JSONField注解来标记JSON字段,同时在mapper.xml中使用json函数来操作JSON字段,需要的朋友可以参考下2024-01-01


最新评论