From 77e8c12c966069be16c709b892635dfed4b27108 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 28 Oct 2025 15:17:18 -0500 Subject: [PATCH] fix --- esphome/components/api/proto.h | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/esphome/components/api/proto.h b/esphome/components/api/proto.h index 730b520c40..2b7bbe5a73 100644 --- a/esphome/components/api/proto.h +++ b/esphome/components/api/proto.h @@ -260,22 +260,10 @@ class ProtoWriteBuffer { return; } - // Rare case: 5-10 byte values - calculate size, single resize, loop encode - // We know value >= 268435456, so skip checks for 1-4 bytes - uint32_t size; - if (value < (1ULL << 35)) { - size = 5; - } else if (value < (1ULL << 42)) { - size = 6; - } else if (value < (1ULL << 49)) { - size = 7; - } else if (value < (1ULL << 56)) { - size = 8; - } else if (value < (1ULL << 63)) { - size = 9; - } else { - size = 10; - } + // Rare case: 5-10 byte values - use CLZ to calculate size + // Value is guaranteed >= 268435456, so CLZ is safe (non-zero) + uint32_t bits = 64 - __builtin_clzll(value); + uint32_t size = (bits + 6) / 7; buffer->resize(start + size); p = buffer->data() + start;