40 lines
1.4 KiB
Zig
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, ""));
|
|
}
|