Mercurial > hg > orthanc
diff OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp @ 4515:8734caa12448
Improved precision of floating-point numbers in DICOM-as-JSON and DICOM summary
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 16 Feb 2021 14:42:04 +0100 |
parents | 5b929e6b3c36 |
children | 671ee7c1fd46 |
line wrap: on
line diff
--- a/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Tue Feb 16 12:18:41 2021 +0100 +++ b/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Tue Feb 16 14:42:04 2021 +0100 @@ -1265,6 +1265,65 @@ +TEST(ParsedDicomFile, FloatPrecision) +{ + Float32 v; + + switch (Toolbox::DetectEndianness()) + { + case Endianness_Little: + reinterpret_cast<uint8_t*>(&v)[3] = 0x4E; + reinterpret_cast<uint8_t*>(&v)[2] = 0x9C; + reinterpret_cast<uint8_t*>(&v)[1] = 0xAD; + reinterpret_cast<uint8_t*>(&v)[0] = 0x8F; + break; + + case Endianness_Big: + reinterpret_cast<uint8_t*>(&v)[0] = 0x4E; + reinterpret_cast<uint8_t*>(&v)[1] = 0x9C; + reinterpret_cast<uint8_t*>(&v)[2] = 0xAD; + reinterpret_cast<uint8_t*>(&v)[3] = 0x8F; + break; + + default: + throw OrthancException(ErrorCode_InternalError); + } + + ParsedDicomFile f(false); + ASSERT_TRUE(f.GetDcmtkObject().getDataset()->putAndInsertFloat32(DCM_ExaminedBodyThickness /* VR: FL */, v).good()); + + { + Float32 u; + ASSERT_TRUE(f.GetDcmtkObject().getDataset()->findAndGetFloat32(DCM_ExaminedBodyThickness, u).good()); + ASSERT_FLOAT_EQ(u, v); + ASSERT_TRUE(memcmp(&u, &v, 4) == 0); + } + + { + Json::Value json; + f.DatasetToJson(json, DicomToJsonFormat_Short, DicomToJsonFlags_None, 256); + ASSERT_EQ("1314310016", json["0010,9431"].asString()); + } + + { + DicomMap summary; + f.ExtractDicomSummary(summary, 256); + std::string s; + ASSERT_EQ("1314310016", summary.GetStringValue(DicomTag(0x0010, 0x9431), "nope", false)); + } + + { + // This flavor uses "Json::Value" serialization + DicomWebJsonVisitor visitor; + f.Apply(visitor); + Float32 u = visitor.GetResult() ["00109431"]["Value"][0].asFloat(); + ASSERT_FLOAT_EQ(u, v); + ASSERT_TRUE(memcmp(&u, &v, 4) == 0); + } +} + + + TEST(Toolbox, RemoveIso2022EscapeSequences) { // +----------------------------------+