JAVA解析DICOM图之获得16进制数据

    xiaoxiao2021-12-15  23

    最近的一个项目需要用JAVA来解析DICOM图片遇到一些问题下面做一些记录

    首先找一个*.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(", "); } } }
    转载请注明原文地址: https://ju.6miu.com/read-1000225.html

    最新回复(0)