diff --git a/src/json-pack/resp/RespEncoder.ts b/src/json-pack/resp/RespEncoder.ts
index 65b170cb5d..2fab26868f 100644
--- a/src/json-pack/resp/RespEncoder.ts
+++ b/src/json-pack/resp/RespEncoder.ts
@@ -300,15 +300,29 @@ export class RespEncoder<W extends IWriter & IWriterGrowable = IWriter & IWriter
   }
 
   public writeStartBin(): void {
-    throw new Error('Not implemented');
+    this.writer.u32(
+      36 * 0x1000000 + // $
+        (63 << 16) + // ?
+        RESP.RN, // \r\n
+    );
   }
 
   public writeBinChunk(buf: Uint8Array): void {
-    throw new Error('Not implemented');
+    const writer = this.writer;
+    const length = buf.length;
+    writer.u8(59); // ;
+    writer.ascii(length + '');
+    writer.u16(RESP.RN); // \r\n
+    writer.buf(buf, length);
+    writer.u16(RESP.RN); // \r\n
   }
 
   public writeEndBin(): void {
-    throw new Error('Not implemented');
+    this.writer.u32(
+      59 * 0x1000000 + // ;
+        (48 << 16) + // 0
+        RESP.RN, // \r\n
+    );
   }
 
   public writeStartArr(): void {
diff --git a/src/json-pack/resp/__tests__/RespEncoder.spec.ts b/src/json-pack/resp/__tests__/RespEncoder.spec.ts
index a5dd9ffa24..574bc282c9 100644
--- a/src/json-pack/resp/__tests__/RespEncoder.spec.ts
+++ b/src/json-pack/resp/__tests__/RespEncoder.spec.ts
@@ -283,4 +283,16 @@ describe('streaming data', () => {
       expect(toStr(encoded)).toBe('$?\r\n;3\r\nabc\r\n;3\r\ndef\r\n;0\r\n');
     });
   });
+
+  describe('binary', () => {
+    test('can write a streaming binary', () => {
+      const encoder = new RespEncoder();
+      encoder.writeStartBin();
+      encoder.writeBinChunk(new Uint8Array([65]));
+      encoder.writeBinChunk(new Uint8Array([66]));
+      encoder.writeEndBin();
+      const encoded = encoder.writer.flush();
+      expect(toStr(encoded)).toBe('$?\r\n;1\r\nA\r\n;1\r\nB\r\n;0\r\n');
+    });
+  });
 });