if(entry.startsWith("METADATA_BLOCK_PICTURE=")) {
// Decode base64 picture data
- ByteVector picturedata = entry.mid(23, entry.size()-23).fromBase64();
+ ByteVector picturedata = ByteVector::fromBase64(entry.mid(23));
if(picturedata.size()==0) {
debug("Empty picture data. Discarding content");
-ByteVector & ByteVector::fromBase64()
+ByteVector ByteVector::fromBase64(const ByteVector & input)
{
static const unsigned char base64[256]={
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
};
- detach();
- uint len = size();
- const unsigned char * src = (unsigned char*) data();
- unsigned char * dst = (unsigned char*) data();
+ uint len = input.size();
+
+ ByteVector output(len);
+
+ const unsigned char * src = (unsigned char*) input.data();
+ unsigned char * dst = (unsigned char*)output.data();
while(4<=len) {
if(base64[src[0]]==0x80) break;
if(base64[src[1]]==0x80) break;
src+=4;
len-=4;
}
- resize(dst-(unsigned char*)data());
- return *this;
+ output.resize(dst-(unsigned char*)output.data());
+ return output;
}
ByteVector toBase64() const;
/*!
- * Decodes the base64 encoded byte vector in-memory. Returns a reference
- * to this vector. Calls detach before decoding.
+ * Decodes the base64 encoded byte vector.
*/
- ByteVector & fromBase64();
-
-
+ static ByteVector fromBase64(const ByteVector &);
protected:
/*
// Decode
CPPUNIT_ASSERT_EQUAL(sempty, eempty.toBase64());
- CPPUNIT_ASSERT_EQUAL(s0, e0.fromBase64());
- CPPUNIT_ASSERT_EQUAL(s1, e1.fromBase64());
- CPPUNIT_ASSERT_EQUAL(s2, e2.fromBase64());
- CPPUNIT_ASSERT_EQUAL(s3, e3.fromBase64());
-
- CPPUNIT_ASSERT_EQUAL(t0, s0.toBase64().fromBase64());
- CPPUNIT_ASSERT_EQUAL(t1, s1.toBase64().fromBase64());
- CPPUNIT_ASSERT_EQUAL(t2, s2.toBase64().fromBase64());
- CPPUNIT_ASSERT_EQUAL(t3, s3.toBase64().fromBase64());
+ CPPUNIT_ASSERT_EQUAL(s0, ByteVector::fromBase64(e0));
+ CPPUNIT_ASSERT_EQUAL(s1, ByteVector::fromBase64(e1));
+ CPPUNIT_ASSERT_EQUAL(s2, ByteVector::fromBase64(e2));
+ CPPUNIT_ASSERT_EQUAL(s3, ByteVector::fromBase64(e3));
+
+ CPPUNIT_ASSERT_EQUAL(t0, ByteVector::fromBase64(s0.toBase64()));
+ CPPUNIT_ASSERT_EQUAL(t1, ByteVector::fromBase64(s1.toBase64()));
+ CPPUNIT_ASSERT_EQUAL(t2, ByteVector::fromBase64(s2.toBase64()));
+ CPPUNIT_ASSERT_EQUAL(t3, ByteVector::fromBase64(s3.toBase64()));
}