这里有新鲜出炉的 Java 设计模式,程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称.
DICOM 就是医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052),下面这篇文章主要给大家介绍了关于 Java 解析 DICOM 图之如何获得 16 进制数据的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下.
前言
在最近的一个项目需要用 JAVA 来解析 DICOM 图片,DICOM 被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X 射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用,在实现中遇到一些问题下面做一些记录.
首先找一个 *.dcm 文件.用编辑器打开可以看到如下界面.我是用的编辑器是 UltraEdit
红字标注的是字节码的标注,前面 8 行代码是文件的头信息一般没用.从第九行开始的四个十六进制数 "44,49,43,4D" 是很重要的.用 ASCll 码解释就是 DICM.表示这是一个 DICOM 文件,这四个 16 进制数如果丢失或损坏,这个 DICOM 图片就无法打开了.
下面用 java 来读取这些十六进制数
(因为文件太大有 13 万个字节,所以为了展示只循环 1 万次.读取前一万个字节)
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(", ");
}
}
}
}
上面的代码很普通就是将文件流读入 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(", ");
}
}
}
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持.
来源: http://www.phperz.com/article/18/0117/352941.html