Skip to content

Commit 220688e

Browse files
feat: write/read string
1 parent ce8e27a commit 220688e

File tree

4 files changed

+54
-18
lines changed

4 files changed

+54
-18
lines changed

include/binarystream/BinaryStream.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,11 @@ class BinaryStream : public ReadOnlyBinaryStream {
5050
BSAPI void writeNormalizedFloat(float value);
5151
BSAPI void writeSignedBigEndianInt(int32_t value);
5252
BSAPI void writeString(std::string_view value);
53+
BSAPI void writeShortString(std::string_view value);
54+
BSAPI void writeLongString(std::string_view value);
5355
BSAPI void writeUnsignedInt24(uint32_t value);
5456
BSAPI void writeRawBytes(std::string_view rawBuffer);
57+
BSAPI void writeRawBytes(std::string_view rawBuffer, size_t size);
5558
BSAPI void writeStream(ReadOnlyBinaryStream const& stream);
5659
};
5760

include/binarystream/ReadOnlyBinaryStream.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,15 @@ class ReadOnlyBinaryStream {
105105
[[nodiscard]] BSAPI int32_t getSignedBigEndianInt() noexcept;
106106
[[nodiscard]] BSAPI uint32_t getUnsignedInt24() noexcept;
107107

108-
BSAPI void getString(std::string& outString);
108+
BSAPI void getString(std::string& outString);
109+
BSAPI void getShortString(std::string& outString);
110+
BSAPI void getLongString(std::string& outString);
111+
109112
[[nodiscard]] BSAPI std::string getString();
110-
BSAPI void getRawBytes(std::string& rawBuffer, size_t length);
113+
[[nodiscard]] BSAPI std::string getShortString();
114+
[[nodiscard]] BSAPI std::string getLongString();
115+
116+
BSAPI void getRawBytes(std::string& rawBuffer, size_t length);
111117
[[nodiscard]] BSAPI std::string getRawBytes(size_t length);
112118
};
113119

src/binarystream/BinaryStream.cpp

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,21 @@ void BinaryStream::writeNormalizedFloat(float value) {
121121
void BinaryStream::writeSignedBigEndianInt(int32_t value) { write(value, true); }
122122

123123
void BinaryStream::writeString(std::string_view value) {
124-
writeUnsignedVarInt(static_cast<uint32_t>(value.size()));
125-
if (!value.empty()) {
126-
mBuffer.append(value.data(), value.size());
127-
mBufferView = mBuffer;
128-
}
124+
auto size = static_cast<uint32_t>(value.size());
125+
writeUnsignedVarInt(size);
126+
writeRawBytes(value, size);
127+
}
128+
129+
void BinaryStream::writeShortString(std::string_view value) {
130+
auto size = static_cast<uint16_t>(value.size());
131+
writeSignedShort(size);
132+
writeRawBytes(value, size);
133+
}
134+
135+
void BinaryStream::writeLongString(std::string_view value) {
136+
auto size = static_cast<int>(value.size());
137+
writeSignedInt(size);
138+
writeRawBytes(value, size);
129139
}
130140

131141
void BinaryStream::writeUnsignedInt24(uint32_t value) {
@@ -147,6 +157,13 @@ void BinaryStream::writeRawBytes(std::string_view rawBuffer) {
147157
}
148158
}
149159

160+
void BinaryStream::writeRawBytes(std::string_view rawBuffer, size_t size) {
161+
if (!rawBuffer.empty()) {
162+
mBuffer.append(rawBuffer.data(), size);
163+
mBufferView = mBuffer;
164+
}
165+
}
166+
150167
void BinaryStream::writeStream(ReadOnlyBinaryStream const& stream) { writeRawBytes(stream.view()); }
151168

152169
} // namespace bstream

src/binarystream/ReadOnlyBinaryStream.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -218,19 +218,17 @@ int32_t ReadOnlyBinaryStream::getSignedBigEndianInt() noexcept {
218218

219219
void ReadOnlyBinaryStream::getString(std::string& outString) {
220220
uint32_t length = getUnsignedVarInt();
221-
if (mHasOverflowed || length == 0) {
222-
outString.clear();
223-
return;
224-
}
221+
getRawBytes(outString, length);
222+
}
225223

226-
if (mReadPointer + length > mBufferView.size()) {
227-
mHasOverflowed = true;
228-
outString.clear();
229-
return;
230-
}
224+
void ReadOnlyBinaryStream::getShortString(std::string& outString) {
225+
short length = getSignedShort();
226+
getRawBytes(outString, length);
227+
}
231228

232-
outString.assign(mBufferView.substr(mReadPointer, length));
233-
mReadPointer += length;
229+
void ReadOnlyBinaryStream::getLongString(std::string& outString) {
230+
int length = getSignedInt();
231+
getRawBytes(outString, length);
234232
}
235233

236234
std::string ReadOnlyBinaryStream::getString() {
@@ -239,6 +237,18 @@ std::string ReadOnlyBinaryStream::getString() {
239237
return result;
240238
}
241239

240+
std::string ReadOnlyBinaryStream::getShortString() {
241+
std::string result;
242+
getShortString(result);
243+
return result;
244+
}
245+
246+
std::string ReadOnlyBinaryStream::getLongString() {
247+
std::string result;
248+
getLongString(result);
249+
return result;
250+
}
251+
242252
uint32_t ReadOnlyBinaryStream::getUnsignedInt24() noexcept {
243253
if (mReadPointer + 3 > mBufferView.size()) {
244254
mHasOverflowed = true;

0 commit comments

Comments
 (0)