如何识别 DICOM 文件? C#
How to recognize DICOM files? C#
我有一个包含文件的文件夹,但并非所有文件都是 DICOM 文件,我需要识别哪个是 DICOM。
我的第一个决定是在检查扩展名的地方创建 foreach 循环:
foreach (var item in fileList.Where(x => x.Extension == ".dcm"))
{
}
但不是所有的都有“.dcm”,有些没有,但它们是 DICOM。
我正在使用 fo-dicom nuget 包,但没有在那里找到答案。
我的问题是:
如何检查所有文件的 DICOM?
我知道 Dicom 文件有 128 个空闲字节,最后 4 个字节用于“DICM”,但我如何检查它?
您可以跳过文件的前 128 个字节,读取接下来的 4 个字节,并将它们与“DICM”的 ASCII 码进行比较,例如:
byte[] dicomPrefix = new byte[4];
byte[] expectedPrefix = "DICM".Select(c => (byte)c).ToArray();
using (var file = File.OpenRead("your filepath here"))
{
if (file.Length >= 132)
{
file.Position = 128; // Skip first 128 bytes.
file.Read(dicomPrefix, 0, dicomPrefix.Length);
if (dicomPrefix.SequenceEqual(expectedPrefix))
{
// It's a DICOM file.
}
}
}
如果您使用的是 fo-dicom,那么您可以使用内置方法 DicomFile.HasValidHeader(filename)
,即 returns true 或 false。
此方法检查那些魔术字节,但也检查旧版本的 dicom,其中不存在 128 个字节。
我想我找到了解决问题的方法:
foreach (FileInfo f in fileList)
{
bool isDicom = DicomFile.HasValidHeader(f.FullName);
if (isDicom)
{
}
}
我有一个包含文件的文件夹,但并非所有文件都是 DICOM 文件,我需要识别哪个是 DICOM。
我的第一个决定是在检查扩展名的地方创建 foreach 循环:
foreach (var item in fileList.Where(x => x.Extension == ".dcm"))
{
}
但不是所有的都有“.dcm”,有些没有,但它们是 DICOM。
我正在使用 fo-dicom nuget 包,但没有在那里找到答案。
我的问题是: 如何检查所有文件的 DICOM?
我知道 Dicom 文件有 128 个空闲字节,最后 4 个字节用于“DICM”,但我如何检查它?
您可以跳过文件的前 128 个字节,读取接下来的 4 个字节,并将它们与“DICM”的 ASCII 码进行比较,例如:
byte[] dicomPrefix = new byte[4];
byte[] expectedPrefix = "DICM".Select(c => (byte)c).ToArray();
using (var file = File.OpenRead("your filepath here"))
{
if (file.Length >= 132)
{
file.Position = 128; // Skip first 128 bytes.
file.Read(dicomPrefix, 0, dicomPrefix.Length);
if (dicomPrefix.SequenceEqual(expectedPrefix))
{
// It's a DICOM file.
}
}
}
如果您使用的是 fo-dicom,那么您可以使用内置方法 DicomFile.HasValidHeader(filename)
,即 returns true 或 false。
此方法检查那些魔术字节,但也检查旧版本的 dicom,其中不存在 128 个字节。
我想我找到了解决问题的方法:
foreach (FileInfo f in fileList)
{
bool isDicom = DicomFile.HasValidHeader(f.FullName);
if (isDicom)
{
}
}