Mercurial > hg > orthanc
comparison 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 |
comparison
equal
deleted
inserted
replaced
4514:5b929e6b3c36 | 4515:8734caa12448 |
---|---|
1258 ParsedDicomFile d(m, Encoding_Latin3 /* default encoding */, false); | 1258 ParsedDicomFile d(m, Encoding_Latin3 /* default encoding */, false); |
1259 | 1259 |
1260 bool hasCodeExtensions; | 1260 bool hasCodeExtensions; |
1261 ASSERT_EQ(Encoding_Latin3, d.DetectEncoding(hasCodeExtensions)); | 1261 ASSERT_EQ(Encoding_Latin3, d.DetectEncoding(hasCodeExtensions)); |
1262 ASSERT_FALSE(hasCodeExtensions); | 1262 ASSERT_FALSE(hasCodeExtensions); |
1263 } | |
1264 } | |
1265 | |
1266 | |
1267 | |
1268 TEST(ParsedDicomFile, FloatPrecision) | |
1269 { | |
1270 Float32 v; | |
1271 | |
1272 switch (Toolbox::DetectEndianness()) | |
1273 { | |
1274 case Endianness_Little: | |
1275 reinterpret_cast<uint8_t*>(&v)[3] = 0x4E; | |
1276 reinterpret_cast<uint8_t*>(&v)[2] = 0x9C; | |
1277 reinterpret_cast<uint8_t*>(&v)[1] = 0xAD; | |
1278 reinterpret_cast<uint8_t*>(&v)[0] = 0x8F; | |
1279 break; | |
1280 | |
1281 case Endianness_Big: | |
1282 reinterpret_cast<uint8_t*>(&v)[0] = 0x4E; | |
1283 reinterpret_cast<uint8_t*>(&v)[1] = 0x9C; | |
1284 reinterpret_cast<uint8_t*>(&v)[2] = 0xAD; | |
1285 reinterpret_cast<uint8_t*>(&v)[3] = 0x8F; | |
1286 break; | |
1287 | |
1288 default: | |
1289 throw OrthancException(ErrorCode_InternalError); | |
1290 } | |
1291 | |
1292 ParsedDicomFile f(false); | |
1293 ASSERT_TRUE(f.GetDcmtkObject().getDataset()->putAndInsertFloat32(DCM_ExaminedBodyThickness /* VR: FL */, v).good()); | |
1294 | |
1295 { | |
1296 Float32 u; | |
1297 ASSERT_TRUE(f.GetDcmtkObject().getDataset()->findAndGetFloat32(DCM_ExaminedBodyThickness, u).good()); | |
1298 ASSERT_FLOAT_EQ(u, v); | |
1299 ASSERT_TRUE(memcmp(&u, &v, 4) == 0); | |
1300 } | |
1301 | |
1302 { | |
1303 Json::Value json; | |
1304 f.DatasetToJson(json, DicomToJsonFormat_Short, DicomToJsonFlags_None, 256); | |
1305 ASSERT_EQ("1314310016", json["0010,9431"].asString()); | |
1306 } | |
1307 | |
1308 { | |
1309 DicomMap summary; | |
1310 f.ExtractDicomSummary(summary, 256); | |
1311 std::string s; | |
1312 ASSERT_EQ("1314310016", summary.GetStringValue(DicomTag(0x0010, 0x9431), "nope", false)); | |
1313 } | |
1314 | |
1315 { | |
1316 // This flavor uses "Json::Value" serialization | |
1317 DicomWebJsonVisitor visitor; | |
1318 f.Apply(visitor); | |
1319 Float32 u = visitor.GetResult() ["00109431"]["Value"][0].asFloat(); | |
1320 ASSERT_FLOAT_EQ(u, v); | |
1321 ASSERT_TRUE(memcmp(&u, &v, 4) == 0); | |
1263 } | 1322 } |
1264 } | 1323 } |
1265 | 1324 |
1266 | 1325 |
1267 | 1326 |