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

作者:Kerrigeng 时间:2023-06-15 17:37:29 

前言

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

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

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

红字标注的是字节码的标注,前面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])将其转化成十六进制。

问题出现了。

运行后:

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

对照上面的编辑器打开的十六进制列表红字处本该是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(", ");
  }
 }
}

来源:http://blog.csdn.net/kerrigeng/article/details/53519584

标签:java,解析dicom,16进制
0
投稿

猜你喜欢

  • RocketMQ之Consumer整体介绍启动源码分析

    2022-06-04 03:53:31
  • Android整理好的图片压缩工具类

    2023-11-06 03:24:19
  • Android 3D滑动菜单完全解析 Android实现推拉门式的立体特效

    2022-04-19 04:36:01
  • 你知道将Bean交给Spring容器管理有几种方式(推荐)

    2021-07-17 08:36:23
  • Java堆内存又溢出了!教你一招必杀技(推荐)

    2022-09-22 06:32:55
  • Java基础之练习打印三角形

    2023-08-25 05:39:33
  • JAVA 获取系统当前时间实例代码

    2022-09-01 05:53:01
  • SpringBoot应用部署于外置Tomcat容器的方法

    2021-07-19 18:36:34
  • java解析json数组方式

    2023-08-10 17:22:14
  • Android10开发者常见问题(小结)

    2023-05-08 10:27:24
  • java内部类的定义与分类示例详解

    2022-07-01 20:16:47
  • Android gradle打包并自动上传的方法

    2022-01-23 06:50:37
  • Java通过JavaMail发送邮件功能

    2022-09-07 16:47:20
  • 浅谈单例模式和线程安全问题

    2023-11-25 06:27:34
  • Android开发笔记之:用Enum(枚举类型)取代整数集的应用详解

    2021-08-25 20:50:41
  • spring中bean的生命周期详解

    2021-11-29 23:31:02
  • 关于Java中增强for循环使用的注意事项

    2021-08-09 16:47:43
  • Java日常练习题,每天进步一点点(8)

    2022-04-15 16:40:26
  • OpenCV Java实现人脸识别和裁剪功能

    2022-08-21 01:47:23
  • Java循环对bean的属性进行赋值的实现

    2023-01-27 10:18:05
  • asp之家 软件编程 m.aspxhome.com