网站建设工作室,神级网页设计网站,个人备案能做什么网站,湘潭网站设计公司转自#xff1a;dicom网络通讯入门#xff08;1#xff09; - assassinx - 博客园
如果只看标准就会越看越糊涂#xff0c;根本原因就是因为dicom抽象得太严重#xff0c;是“专家”弄的。没办法。
那么到底服务类是什么#xff1f;sop 又是什么#xff1f;#xff0…转自dicom网络通讯入门1 - assassinx - 博客园
如果只看标准就会越看越糊涂根本原因就是因为dicom抽象得太严重是“专家”弄的。没办法。
那么到底服务类是什么sop 又是什么相信你把dicom标准看到头大 都不知如何下手。 其实本质上就是 socket。
要想理解Dicom网络部分首先得理解什么叫pdu然后从pdu入门 。 pdu就是pdu protocol data unit 可以把它理解为socket数据包。 它的结构是开始1字节是pdu类型 然后一字节始终是0 然后是4字节 表示数据长度 然后是指定长度的数据。
简图 然后专门为了 写这个博客 我弄了点 测试数据都是二进制文件 好然后我们立马来设计一个程序立马 ok 开搞 1 namespace DcmEcho2 {3 class Program4 {5 static void Main(string[] args)6 {7 TcpClient client new TcpClient();8 client.Connect(localhost, 104);9 NetworkStream stream client.GetStream();
10
11 byte[] data dump(0);
12 byte[] data_res new byte[1024];
13 uint len 0;
14 stream.Write(data, 0, data.Length);
15 stream.Read(data_res, 0, 2);
16 stream.Read(data_res, 0, 4);
17 //注意此处是big字节序要进行翻转
18 Array.Reverse(data_res, 0, 4);
19 len BitConverter.ToUInt32(data_res, 0);
20 stream.Read(data_res, 0, (int)len);
21
22 data dump(1);
23 stream.Write(data, 0, data.Length);
24 stream.Read(data_res, 0, 2);
25 stream.Read(data_res, 0, 4);
26 Array.Reverse(data_res, 0, 4);
27 len BitConverter.ToUInt32(data_res, 0);
28 stream.Read(data_res, 0, (int)len);
29
30 data dump(2);
31 stream.Write(data, 0, data.Length);
32
33 Console.ReadKey();
34 }
35
36 static byte[] dump(int indx)
37 {
38 string[] datas new string[3];
39 datas[0] 01 00 00 00 00 CC 00 01 00 00 64 63 6D 70 72 69
40 6E 74 65 72 00 00 00 00 00 00 64 63 6D 56 69 65
41 77 65 72 00 00 00 00 00 00 00 00 00 00 00 00 00
42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
43 00 00 00 00 00 00 00 00 00 00 10 00 00 15 31 2E
44 32 2E 38 34 30 2E 31 30 30 30 38 2E 33 2E 31 2E
45 31 2E 31 20 00 00 2E 01 00 00 00 30 00 00 11 31
46 2E 32 2E 38 34 30 2E 31 30 30 30 38 2E 31 2E 31
47 40 00 00 11 31 2E 32 2E 38 34 30 2E 31 30 30 30
48 38 2E 31 2E 32 50 00 00 39 51 00 00 04 00 00 40
49 00 52 00 00 1E 31 2E 32 2E 38 32 36 2E 30 2E 31
50 2E 31 32 33 34 35 36 37 2E 32 2E 31 33 39 36 2E
51 39 39 39 55 00 00 0B 41 53 53 41 53 53 4D 65 64
52 69 63
53 ;
54 datas[1] 04 00 00 00 00 4A 00 00 00 46 01 03 00 00 00 00
55 04 00 00 00 38 00 00 00 00 00 02 00 12 00 00 00
56 31 2E 32 2E 38 34 30 2E 31 30 30 30 38 2E 31 2E
57 31 00 00 00 00 01 02 00 00 00 30 00 00 00 10 01
58 02 00 00 00 03 00 00 00 00 08 02 00 00 00 01 01
59 ;
60 datas[2] 05 00 00 00 00 04 00 00 00 00;
61
62 datas[indx] datas[indx].Trim().Replace( , );
63 datas[indx] datas[indx].Replace(\n, );
64 datas[indx] datas[indx].Replace(\r, );
65
66 byte[] data new byte[datas[indx].Length / 2];
67 for (int i 0; i data.Length; i)
68 {
69 data[i] (byte)Convert.ToInt32(datas[indx].Substring(i * 2, 2), 16);
70 }
71 return data;
72 }
73 }
74 }
好 我们来测试下我们始终都用这个程序进行测试。 喏 echo响应测试成功 理解这些了然后呢 你不可能 每次别人来都把这一坨屎一样的东西塞给别人吧参数不一样 请求的各种实例uid、dimse命令和数据都不一样不会报错么 这是dicom协议程序 不是普通的socket程序虽然都是基于socket的。明白你要做什么了吧坦白的说没什么技术含量 但这却是一个相当大的工程 并且要心细慢慢来。这是整个从协商连接 到打印完成要经过的步骤流程图