diff --git a/scapy/layers/bluetooth.py b/scapy/layers/bluetooth.py
index cb845062ceaeedcf4991de46c4b35b10cf60c38a..234dbcc9ab1307bec37982943963b19aede0cfd8 100644
--- a/scapy/layers/bluetooth.py
+++ b/scapy/layers/bluetooth.py
@@ -71,8 +71,7 @@ class HCI_ACL_Hdr(Packet):
     def post_build(self, p, pay):
         p += pay
         if self.len is None:
-            l = len(p)-4
-            p = p[:2]+chr(l&0xff)+chr((l>>8)&0xff)+p[4:]
+            p = p[:2] + struct.pack("<H", len(pay)) + p[4:]
         return p
 
 
@@ -84,8 +83,7 @@ class L2CAP_Hdr(Packet):
     def post_build(self, p, pay):
         p += pay
         if self.len is None:
-            l = len(pay)
-            p = chr(l&0xff)+chr((l>>8)&0xff)+p[2:]
+            p = struct.pack("<H", len(pay)) + p[2:]
         return p
 
 
@@ -103,8 +101,7 @@ class L2CAP_CmdHdr(Packet):
     def post_build(self, p, pay):
         p += pay
         if self.len is None:
-            l = len(p)-4
-            p = p[:2]+chr(l&0xff)+chr((l>>8)&0xff)+p[4:]
+            p = p[:2] + struct.pack("<H", len(pay)) + p[4:]
         return p
     def answers(self, other):
         if other.id == self.id:
@@ -464,8 +461,7 @@ class HCI_Command_Hdr(Packet):
     def post_build(self, p, pay):
         p += pay
         if self.len is None:
-            l = len(p)-3
-            p = p[:2]+chr(l&0xff)+p[3:]
+            p = p[:2] + struct.pack("B", len(pay)) + p[3:]
         return p
 
 class HCI_Cmd_Reset(Packet):
diff --git a/test/bluetooth.uts b/test/bluetooth.uts
index 3ac5acad9852770ac17fd65ea7d51c2f827a7d44..253c26e5553d94918aaddb97ce0d3a5c6489c572 100644
--- a/test/bluetooth.uts
+++ b/test/bluetooth.uts
@@ -3,18 +3,18 @@
 + HCI Commands
 = LE Create Connection Cancel
 
-expected_cmd_raw_data = "010e2000".decode('hex')
-cmd_raw_data = str(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_LE_Create_Connection_Cancel())
+expected_cmd_raw_data = hex_bytes("010e2000")
+cmd_raw_data = raw(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_LE_Create_Connection_Cancel())
 assert(expected_cmd_raw_data == cmd_raw_data)
 
 = Disconnect
-expected_cmd_raw_data = "01060403341213".decode('hex')
-cmd_raw_data = str(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Disconnect(handle=0x1234))
+expected_cmd_raw_data = hex_bytes("01060403341213")
+cmd_raw_data = raw(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Disconnect(handle=0x1234))
 assert(expected_cmd_raw_data == cmd_raw_data)
 
 = LE Connection Update Command
-expected_cmd_raw_data = "0113200e47000a00140001003c000100ffff".decode('hex')
-cmd_raw_data = str(
+expected_cmd_raw_data = hex_bytes("0113200e47000a00140001003c000100ffff")
+cmd_raw_data = raw(
     HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_LE_Connection_Update(
         handle=0x47, min_interval=10, max_interval=20, latency=1, timeout=60,
         min_ce=1, max_ce=0xffff))
@@ -23,7 +23,7 @@ assert(expected_cmd_raw_data == cmd_raw_data)
 
 + HCI Events
 = LE Connection Update Event
-evt_raw_data = "043e0a03004800140001003c00".decode('hex')
+evt_raw_data = hex_bytes("043e0a03004800140001003c00")
 evt_pkt =  HCI_Hdr(evt_raw_data)
 assert(evt_pkt[HCI_LE_Meta_Connection_Update_Complete].handle == 0x48)
 assert(evt_pkt[HCI_LE_Meta_Connection_Update_Complete].interval == 20)
@@ -35,20 +35,20 @@ assert(evt_pkt[HCI_LE_Meta_Connection_Update_Complete].timeout == 60)
 = Parse EIR_Flags, EIR_CompleteList16BitServiceUUIDs, EIR_CompleteLocalName and EIR_TX_Power_Level
 
 ad_report_raw_data = \
-    "043e2b020100016522c00181781f0201020303d9fe1409" \
-    "506562626c652054696d65204c452037314536020a0cde".decode('hex')
+    hex_bytes("043e2b020100016522c00181781f0201020303d9fe1409" \
+              "506562626c652054696d65204c452037314536020a0cde")
 scapy_packet = HCI_Hdr(ad_report_raw_data)
 
 assert(scapy_packet[EIR_Flags].flags == 0x02)
 assert(scapy_packet[EIR_CompleteList16BitServiceUUIDs].svc_uuids == [0xfed9])
-assert(scapy_packet[EIR_CompleteLocalName].local_name == 'Pebble Time LE 71E6')
+assert(scapy_packet[EIR_CompleteLocalName].local_name == b'Pebble Time LE 71E6')
 assert(scapy_packet[EIR_TX_Power_Level].level == 12)
 
 = Parse EIR_Manufacturer_Specific_Data
 
 scan_resp_raw_data = \
-    "043e2302010401be5e0eb9f04f1716ff5401005f423331" \
-    "3134374432343631fc00030c0000de".decode('hex')
+    hex_bytes("043e2302010401be5e0eb9f04f1716ff5401005f423331" \
+              "3134374432343631fc00030c0000de")
 scapy_packet = HCI_Hdr(scan_resp_raw_data)
 
 assert(scapy_packet[EIR_Manufacturer_Specific_Data].data == b'\x00_B31147D2461\xfc\x00\x03\x0c\x00\x00')