将 Swift 结构转换为数据字节
Convert Swift struct to Data bytes
我想以蓝牙固件期望的格式将字节数据传递给蓝牙服务。
c struct 中的预期数据结构是:
typedef enum {
CMD_TX_INFO = 0,
CMD_DATA_REQ_START,
CMD_DATA_REQ_END,
CMD_DATA_REQ
} ble_cmd_type_t;
typedef struct ble_data_info_s
{
uint32_t data_size_bytes;
uint32_t info;
} ble_data_info_t;
typedef PACKED ( struct ble_cmd_info
{
ble_cmd_type_t cmd_type;
ble_data_info_t info;
uint8_t len;
uint8_t data[10];
}) ble_cmd_data_t;
我已将 this 转换为 swift 结构,如下所示:
enum BLECmdType : UInt8{
case CMD_TX_INFO = 0
case CMD_DATA_REQ_START
case CMD_DATA_REQ_END
case CMD_DATA_REQ
}
struct BLEDataInfo
{
let dataSizeBytes: UInt32
let info: UInt32
}
struct BLECmdData
{
let cmdType:BLECmdType
let info:BLEDataInfo
let len:UInt8
let data: Array<UInt8>?
}
然后我把swit struct object 转换成bytes 这样,不知道这个方法对不对?我没有得到正确预期格式的字节:
var command = BLECmdData(cmdType:BLECmdType.CMD_DATA_REQ_START,
info: BLEDataInfo(dataSizeBytes: 100000, info: 10),
len: 1,
data: [1,2,3,4,5,6,7,8,9,10])
let bleData = Data(bytes: &command , count: MemoryLayout<BLECmdData>.stride)
首先,是否可以以字符串格式打印为 bleData 对象生成的字节,以便我调试和查看?
其次发送到BLE设备的字节是:
Bytes:
01 00 00 00 A0 86 01 00
E5 73 E0 98 0A 00 00 00
70 C5 CA 80
提及固件工程师,数据应以以下开头:
Bytes:
01 00 A0 86 01 00
E5 73 E0 98
我不确定我在这里将 c 结构转换为 swift 的方法是否正确。
期待您的回复。
谢谢
- 行的结果
let bleData = Data(bytes: &command , count: MemoryLayout<BLECmdData>.stride)
这取决于您 运行 编程的 cpu 架构。 (32 位与 64 位,大端与小端)。
- 你必须询问
Firmware engineer
与他们的设备通信的协议,然后你将数据编码为协议中指定的格式。将数据存储在 class/struct/enum 等中并不重要...,重要的是数据的编码方式。
我找到了一种以正确格式成功推送数据的方法:
设置值:
var cmdTypeCopy:UInt8 = BLECmdType.CMD_DATA_REQ_START
var imageInfo = BLEDataInfo(dataSizeBytes: 100000, info: 10)
var cmdLenCopy = 10
var cmdDataCopy:Array<UInt8> = [1,2,3,4,5,6,7,8,9,10]
创建数据:
var cmdTypeData = Data(bytes: &cmdTypeCopy, count: MemoryLayout<UInt8>.stride)
var imageInfoData = Data(bytes: &imageInfo, count: MemoryLayout<BLEImageInfo>.stride)
var cmdLenData = Data(bytes: &cmdLenCopy, count: MemoryLayout<UInt8>.stride)
var cmdDataData = Data(bytes: &cmdDataCopy, count: 10)
然后一一追加:
cmdTypeData.append(imageInfoData)
cmdTypeData.append(cmdLenData)
cmdTypeData.append(cmdDataData)
这非常有效,固件获得了正确格式的数据。
我想以蓝牙固件期望的格式将字节数据传递给蓝牙服务。
c struct 中的预期数据结构是:
typedef enum {
CMD_TX_INFO = 0,
CMD_DATA_REQ_START,
CMD_DATA_REQ_END,
CMD_DATA_REQ
} ble_cmd_type_t;
typedef struct ble_data_info_s
{
uint32_t data_size_bytes;
uint32_t info;
} ble_data_info_t;
typedef PACKED ( struct ble_cmd_info
{
ble_cmd_type_t cmd_type;
ble_data_info_t info;
uint8_t len;
uint8_t data[10];
}) ble_cmd_data_t;
我已将 this 转换为 swift 结构,如下所示:
enum BLECmdType : UInt8{
case CMD_TX_INFO = 0
case CMD_DATA_REQ_START
case CMD_DATA_REQ_END
case CMD_DATA_REQ
}
struct BLEDataInfo
{
let dataSizeBytes: UInt32
let info: UInt32
}
struct BLECmdData
{
let cmdType:BLECmdType
let info:BLEDataInfo
let len:UInt8
let data: Array<UInt8>?
}
然后我把swit struct object 转换成bytes 这样,不知道这个方法对不对?我没有得到正确预期格式的字节:
var command = BLECmdData(cmdType:BLECmdType.CMD_DATA_REQ_START,
info: BLEDataInfo(dataSizeBytes: 100000, info: 10),
len: 1,
data: [1,2,3,4,5,6,7,8,9,10])
let bleData = Data(bytes: &command , count: MemoryLayout<BLECmdData>.stride)
首先,是否可以以字符串格式打印为 bleData 对象生成的字节,以便我调试和查看?
其次发送到BLE设备的字节是:
Bytes:
01 00 00 00 A0 86 01 00
E5 73 E0 98 0A 00 00 00
70 C5 CA 80
提及固件工程师,数据应以以下开头:
Bytes:
01 00 A0 86 01 00
E5 73 E0 98
我不确定我在这里将 c 结构转换为 swift 的方法是否正确。
期待您的回复。
谢谢
- 行的结果
let bleData = Data(bytes: &command , count: MemoryLayout<BLECmdData>.stride)
这取决于您 运行 编程的 cpu 架构。 (32 位与 64 位,大端与小端)。
- 你必须询问
Firmware engineer
与他们的设备通信的协议,然后你将数据编码为协议中指定的格式。将数据存储在 class/struct/enum 等中并不重要...,重要的是数据的编码方式。
我找到了一种以正确格式成功推送数据的方法:
设置值:
var cmdTypeCopy:UInt8 = BLECmdType.CMD_DATA_REQ_START
var imageInfo = BLEDataInfo(dataSizeBytes: 100000, info: 10)
var cmdLenCopy = 10
var cmdDataCopy:Array<UInt8> = [1,2,3,4,5,6,7,8,9,10]
创建数据:
var cmdTypeData = Data(bytes: &cmdTypeCopy, count: MemoryLayout<UInt8>.stride)
var imageInfoData = Data(bytes: &imageInfo, count: MemoryLayout<BLEImageInfo>.stride)
var cmdLenData = Data(bytes: &cmdLenCopy, count: MemoryLayout<UInt8>.stride)
var cmdDataData = Data(bytes: &cmdDataCopy, count: 10)
然后一一追加:
cmdTypeData.append(imageInfoData)
cmdTypeData.append(cmdLenData)
cmdTypeData.append(cmdDataData)
这非常有效,固件获得了正确格式的数据。