1
0
Fork 0
QuasselClient/src/qtshit/read/readQByteArray.zig
2021-06-04 17:48:50 +01:00

40 lines
1.4 KiB
Zig

const std = @import("std");
const readUInt = @import("./readUInt.zig").readUInt;
const range = @import("../utils/RangeIter.zig").range;
const freeQByteArray = @import("../utils/free/freeQByteArray.zig").freeQByteArray;
pub fn readQByteArray(reader: anytype, allocator: *std.mem.Allocator) ![]u8 {
var length = try readUInt(reader);
if (length == std.math.maxInt(@TypeOf(length))) {
return "";
}
var byteList = try allocator.alloc(u8, @intCast(usize, length));
var iter = range(u32, 0, length);
while (iter.next()) |i| {
const byte = try reader.readByte();
byteList[i] = byte;
}
//std.debug.print("read: readQByteArray length={d} content={any} \n", .{length, byteList});
return byteList;
}
test "deserialize QByteArray" {
var bytes = &[_]u8{ 00, 00, 00, 04, 11, 22, 33, 44 };
var fBS = std.io.fixedBufferStream(bytes);
var qbytearray = try readQByteArray(fBS.reader(), std.testing.allocator);
defer freeQByteArray(qbytearray, std.testing.allocator);
try std.testing.expect(std.mem.eql(u8, qbytearray, &[_]u8{ 11, 22, 33, 44 }));
}
test "deserialize QByteArray max length" {
var bytes = &[_]u8{ 0xff, 0xff, 0xff, 0xff };
var fBS = std.io.fixedBufferStream(bytes);
var qbytearray = try readQByteArray(fBS.reader(), std.testing.allocator);
defer freeQByteArray(qbytearray, std.testing.allocator);
try std.testing.expect(std.mem.eql(u8, qbytearray, ""));
}