Field+offset(len)

本文介绍 ABAP 中如何使用特定语法 MOVE 和赋值语句来处理字符串字段的截取与赋值,包括指定偏移量和长度的操作,并提供实际案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MOVE<F1>[+<o1>][(<l1>)] TO<F2>[+<o2>][(<l2>)].

等价于:

<F2>[+<o2>][(<l2>)] = <F1>[+<o1>][(<l1>)].

 

注:这里的位置参数<o1><o2>是从零开始的,如果位置为0,则取的是第一个元素,以此类推。

 

所有偏移量和长度指定都可为变量。

 

SAP 建议只在非数值字段之间才采用指定偏移量和长度赋值,对于数值字段,结果毫无意义

 

DATA: f1(8) VALUE 'ABCDEFGH',
f2(
20) VALUE '12345678901234567890'
.
f2+
6(5) = f1+3(5
).
WRITE
: f2.

输出:

123456DEFGH234567890

image001

 

 

 

 

针对非数字类型字段或扁平结构类型,可以在任何语句中使用下面语句来操作指定区域的字符串:

<f>[+<o>][(<l>)]

如果未指定长度<l>,则对该字段<o>和结尾之间的所有位置进行处理。

 

The data type and length of the string section are as follows:

image063

 

必须将偏移量<o>和长度<l>指定为无符号数值。

 

 

DATA time TYPE t VALUE '172545'.
WRITE time
.
WRITE / time+2(2
).
CLEAR time+2(4
).
WRITE / time
.

172545

25

170000

/* 1、客户端请求与服务端建立连接 C -> S */ void MQTT_Connect(void) { char data[256] = {0}; // 报文缓存数组 int len = 0; // 报文长度计数变量 int Data_Len = 0; // 剩余长度(可变报头 + 有效载荷) char flags = 0; // 连接标志 //------------------ 连接标志配置 ----------------------- // bit1 是否清除会话 if (CLEAN_SESSION) flags |= 0x02; // bit2 是否使用遗嘱消息 if (WILL_FLAG) { flags |= 0x04; // bit3、bit4 遗嘱QoS等级, 默认 QoS0 if (1 == WILL_QOS) // QoS1 flags |= 0x08; if (2 == WILL_QOS) // QoS2 flags |= 0x10; // bit5 是否保留本次会话 if (WILL_RETAIN) flags |= 0x20; } // bit6、bit7 是否使用账号、密码 if (USER_NAME_FLAG ) flags |= 0xC0; // 0x80 | 0x40 //------------------ 连接标志配置 END ----------------------- // 剩余长度 = 可变报头 + 有效载荷(每个字段包含两个字节的长度标识) Data_Len = 10 + (2 + strlen(ClientID)); if (WILL_FLAG) Data_Len += (2 + strlen(WILL_TOPIC)) + (2 + strlen(WILL_MESSAGE)); // 当使用遗嘱消息 if (USER_NAME_FLAG ) Data_Len += (2 + strlen(UserName)) + (2 + strlen(PassWard)); // 当使用用户名和密码登录 // 1. Connect固定报头(Fixed header) // 1.1 控制报文类型 data[len++] = 0x10; // MQTT Message Type CONNECT // 1.2 剩余长度(不包括固定头部) do { char encodedByte = Data_Len % 128; Data_Len = Data_Len / 128; if (Data_Len > 0) // if there are more data to encode, set the top bit of this byte encodedByte = encodedByte | 128; data[len++] = encodedByte; // 填充剩余长度的值 } while (Data_Len > 0); // 2. 可变报头(Variable header) data[len++] = 0; // 2.1 协议名(Protocol Name) data[len++] = 4; data[len++] = 'M'; data[len++] = 'Q'; data[len++] = 'T'; data[len++] = 'T'; data[len++] = 4; // 2.2 协议级别(3.1.1 版协议) data[len++] = flags; // 2.3 连接标志(Connect Flags) C2:置位用户名标志,密码标志,清理会话标志 data[len++] = KEEP_ALIVE / 256; // 2.4 保持连接(Keep Alive) data[len++] = KEEP_ALIVE % 256; // 3. 有效载荷(Payload) /* 3.1 客户端ID */ data[len++] = strlen(ClientID) / 256; data[len++] = strlen(ClientID) % 256; memcpy(&data[len], ClientID, strlen(ClientID)); len += strlen(ClientID); if (WILL_FLAG) { /* 3.2 遗嘱主题 */ data[len++] = strlen(WILL_TOPIC) / 256; data[len++] = strlen(WILL_TOPIC) % 256; memcpy(&data[len], WILL_TOPIC, strlen(WILL_TOPIC)); len += strlen(WILL_TOPIC); /* 3.3 遗嘱消息 */ data[len++] = strlen(WILL_MESSAGE) / 256; data[len++] = strlen(WILL_MESSAGE) % 256; memcpy(&data[len], WILL_MESSAGE, strlen(WILL_MESSAGE)); len += strlen(WILL_MESSAGE); } if (USER_NAME_FLAG) { /* 3.4 用户名 */ data[len++] = strlen(UserName) / 256; data[len++] = strlen(UserName) % 256; memcpy(&data[len], UserName, strlen(UserName)); len += strlen(UserName); /* 3.5 密码 */ data[len++] = strlen(PassWard) / 256; data[len++] = strlen(PassWard) % 256; memcpy(&data[len], PassWard, strlen(PassWard)); len += strlen(PassWard); } // MQTT_SendData(data, len); // 通过串口发送数据到服务器 Write_MQTT_TxDataBuff(data, len); // 将数据复制到发送缓冲数组 #if MQTT_DEBUG // 串口显示信息 printf("\r\n* 1、CONNECT – 连接服务端 *: \r\n"); mqtt_debug(data, len); // 打印调试信息 #endif WIFI_Clean(); } 优化这段代码
03-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值