Skip to content

Commit d4b053a

Browse files
committed
replace random loops with memcpy
Simpler. Probably safer too. Signed-off-by: Rosen Penev <[email protected]>
1 parent 9c3ece1 commit d4b053a

File tree

2 files changed

+10
-25
lines changed

2 files changed

+10
-25
lines changed

src/image.cpp

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -227,31 +227,21 @@ uint16_t Image::byteSwap(uint16_t value, bool bSwap) {
227227
}
228228

229229
uint16_t Image::byteSwap2(const DataBuf& buf, size_t offset, bool bSwap) {
230-
uint16_t v = 0;
231-
auto p = reinterpret_cast<char*>(&v);
232-
p[0] = buf.read_uint8(offset);
233-
p[1] = buf.read_uint8(offset + 1);
230+
uint16_t v;
231+
std::memcpy(&v, buf.c_data(offset), sizeof(uint16_t));
234232
return Image::byteSwap(v, bSwap);
235233
}
236234

237235
uint32_t Image::byteSwap4(const DataBuf& buf, size_t offset, bool bSwap) {
238-
uint32_t v = 0;
239-
auto p = reinterpret_cast<char*>(&v);
240-
p[0] = buf.read_uint8(offset);
241-
p[1] = buf.read_uint8(offset + 1);
242-
p[2] = buf.read_uint8(offset + 2);
243-
p[3] = buf.read_uint8(offset + 3);
236+
uint32_t v;
237+
std::memcpy(&v, buf.c_data(offset), sizeof(uint32_t));
244238
return Image::byteSwap(v, bSwap);
245239
}
246240

247241
/// \todo not used internally. At least we should test it
248242
uint64_t Image::byteSwap8(const DataBuf& buf, size_t offset, bool bSwap) {
249-
uint64_t v = 0;
250-
auto p = reinterpret_cast<byte*>(&v);
251-
252-
for (int i = 0; i < 8; i++)
253-
p[i] = buf.read_uint8(offset + i);
254-
243+
uint64_t v;
244+
std::memcpy(&v, buf.c_data(offset), sizeof(uint64_t));
255245
return Image::byteSwap(v, bSwap);
256246
}
257247

src/pgfimage.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,10 @@ static uint32_t byteSwap_(uint32_t value, bool bSwap) {
4848
}
4949

5050
static uint32_t byteSwap_(Exiv2::DataBuf& buf, size_t offset, bool bSwap) {
51-
uint32_t v = 0;
52-
auto p = reinterpret_cast<byte*>(&v);
53-
int i;
54-
for (i = 0; i < 4; i++)
55-
p[i] = buf.read_uint8(offset + i);
56-
uint32_t result = byteSwap_(v, bSwap);
57-
p = reinterpret_cast<byte*>(&result);
58-
for (i = 0; i < 4; i++)
59-
buf.write_uint8(offset + i, p[i]);
51+
uint32_t v;
52+
std::memcpy(&v, buf.c_data(offset), sizeof(uint32_t));
53+
uint32_t result = Image::byteSwap(v, bSwap);
54+
std::memcpy(buf.data(offset), &result, sizeof(uint32_t));
6055
return result;
6156
}
6257

0 commit comments

Comments
 (0)