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