forked from grailbio/go-dicom
/
transfersyntax.go
70 lines (65 loc) · 2.41 KB
/
transfersyntax.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package dicomio
import (
"encoding/binary"
"fmt"
"github.com/hxhxhx88/go-dicom/dicomuid"
)
// Standard list of transfer syntaxes.
var StandardTransferSyntaxes = []string{
dicomuid.ImplicitVRLittleEndian,
dicomuid.ExplicitVRLittleEndian,
dicomuid.ExplicitVRBigEndian,
dicomuid.DeflatedExplicitVRLittleEndian,
}
// CanonicalTransferSyntaxUID return the canonical transfer syntax UID (e.g.,
// dicomuid.ExplicitVRLittleEndian or dicomuid.ImplicitVRLittleEndian), given an
// UID that represents any transfer syntax. Returns an error if the uid is not
// defined in DICOM standard, or if the uid does not represent a transfer
// syntax.
//
// TODO(saito) Check the standard to see if we need to accept unknown UIDS as
// explicit little endian.
func CanonicalTransferSyntaxUID(uid string) (string, error) {
// defaults are explicit VR, little endian
switch uid {
case dicomuid.ImplicitVRLittleEndian,
dicomuid.ExplicitVRLittleEndian,
dicomuid.ExplicitVRBigEndian,
dicomuid.DeflatedExplicitVRLittleEndian:
return uid, nil
default:
e, err := dicomuid.Lookup(uid)
if err != nil {
return "", err
}
if e.Type != dicomuid.TypeTransferSyntax {
return "", fmt.Errorf("dicom.CanonicalTransferSyntaxUID: '%s' is not a transfer syntax (is %s)", uid, e.Type)
}
// The default is ExplicitVRLittleEndian
return dicomuid.ExplicitVRLittleEndian, nil
}
}
// ParseTransferSyntaxUID parses a transfer syntax uid and returns its byteorder
// and implicitVR/explicitVR type. TrasnferSyntaxUID can be any UID that refers to
// a transfer syntax. It can be, e.g., 1.2.840.10008.1.2 (it will return
// LittleEndian, ImplicitVR) or 1.2.840.10008.1.2.4.54 (it will return
// (LittleEndian, ExplicitVR).
func ParseTransferSyntaxUID(uid string) (bo binary.ByteOrder, implicit IsImplicitVR, deflated bool, err error) {
canonical, err := CanonicalTransferSyntaxUID(uid)
if err != nil {
return nil, UnknownVR, false, err
}
switch canonical {
case dicomuid.ImplicitVRLittleEndian:
return binary.LittleEndian, ImplicitVR, false, nil
case dicomuid.DeflatedExplicitVRLittleEndian:
return binary.LittleEndian, ExplicitVR, true, nil
case dicomuid.ExplicitVRLittleEndian:
return binary.LittleEndian, ExplicitVR, false, nil
case dicomuid.ExplicitVRBigEndian:
return binary.BigEndian, ExplicitVR, false, nil
default:
panic(fmt.Sprintf("Invalid transfer syntax: %v, %v", canonical, uid))
return binary.BigEndian, ExplicitVR, false, nil
}
}