diff --git a/src/util/PackedBigEndian.hxx b/src/util/PackedBigEndian.hxx
index 1933d3ded..d001323b4 100644
--- a/src/util/PackedBigEndian.hxx
+++ b/src/util/PackedBigEndian.hxx
@@ -50,6 +50,26 @@ public:
 static_assert(sizeof(PackedBE16) == sizeof(uint16_t), "Wrong size");
 static_assert(alignof(PackedBE16) == 1, "Wrong alignment");
 
+/**
+ * A packed big-endian signed 16 bit integer.
+ */
+class PackedSignedBE16 {
+	PackedBE16 u;
+
+public:
+	PackedSignedBE16() = default;
+
+	constexpr PackedSignedBE16(int16_t src) noexcept
+		:u(uint16_t(src)) {}
+
+	constexpr operator int16_t() const noexcept {
+		return (int16_t)(uint16_t)u;
+	}
+};
+
+static_assert(sizeof(PackedSignedBE16) == sizeof(int16_t), "Wrong size");
+static_assert(alignof(PackedSignedBE16) == 1, "Wrong alignment");
+
 /**
  * A packed big-endian 32 bit integer.
  */