首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Swift结构转换为数据字节

将Swift结构转换为数据字节
EN

Stack Overflow用户
提问于 2020-06-29 14:44:38
回答 2查看 766关注 0票数 0

我希望以蓝牙固件所期望的格式将字节数据传递给蓝牙服务。

C结构中的预期数据结构是:

代码语言:javascript
复制
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;

我已将其转换为“快速”结构如下:

代码语言:javascript
复制
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>?
}

然后我将struct对象转换成这样的字节,我不确定这种方法是否正确?我没有以正确的预期格式获得字节:

代码语言:javascript
复制
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设备的字节是:

代码语言:javascript
复制
Bytes:
01 00 00 00 A0 86 01 00
E5 73 E0 98 0A 00 00 00
70 C5 CA 80

提到固件工程师,数据应该从以下几个方面开始:

代码语言:javascript
复制
Bytes:
01 00 A0 86 01 00
E5 73 E0 98

我不确定我在这里把c结构转换成斯威夫特的方法是否正确。

期待您的答复。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-07 12:30:42

我找到了一种成功地以正确格式推送数据的方法:

设置值:

代码语言:javascript
复制
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]

创建数据:

代码语言:javascript
复制
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)

然后一个接一个地追加:

代码语言:javascript
复制
cmdTypeData.append(imageInfoData)
cmdTypeData.append(cmdLenData)
cmdTypeData.append(cmdDataData)

这是完美的工作,固件得到了正确的格式数据。

票数 0
EN

Stack Overflow用户

发布于 2020-06-29 16:02:19

let bleData = Data(bytes: &command , count: MemoryLayout<BLECmdData>.stride)行的结果

这取决于您正在运行的程序的cpu体系结构。(32位对64位,大端对小端)。

  1. --您必须询问Firmware engineer有关协议的信息,以便与他们的设备通信,然后将数据编码为协议中指定的格式。将数据存储在类/struct/enum中并不重要,重要的是如何对数据进行编码。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62640632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档