Field+offset(len)

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

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

SEARCH_CAR_INDEX_ENTRY *car_info = (SEARCH_CAR_INDEX_ENTRY *)obj_info; SMART_DATA_OI_VEHICLE_RECOGNITION_VALUE_S value = { .type_sedan = car_info->car_attr[SMART_FIELD_TYPE_SEDAN], .type_suv = car_info->car_attr[SMART_FIELD_TYPE_SUV], .type_bus = car_info->car_attr[SMART_FIELD_TYPE_BUS], .type_microbus = car_info->car_attr[SMART_FIELD_TYPE_MICROBUS], .type_truck = car_info->car_attr[SMART_FIELD_TYPE_TRUCK], .color_white = car_info->car_attr[SMART_FIELD_COLOR_WHITE], .color_gray = car_info->car_attr[SMART_FIELD_COLOR_GRAY], .color_black = car_info->car_attr[SMART_FIELD_COLOR_BLACK], .color_red = car_info->car_attr[SMART_FIELD_COLOR_RED], .color_brown = car_info->car_attr[SMART_FIELD_COLOR_BROWN], .color_blue = car_info->car_attr[SMART_FIELD_COLOR_BLUE], .color_green = car_info->car_attr[SMART_FIELD_COLOR_GREEN], .color_yellow = car_info->car_attr[SMART_FIELD_COLOR_YELLOW], .color_special = car_info->car_attr[SMART_FIELD_COLOR_SPECIAL], .timestamp_start = car_info->start_time, .timestamp_end = car_info->end_time, }; if (0 != car_info->snapLen) { value.thumb = (U8 *)car_info + sizeof(SEARCH_CAR_INDEX_ENTRY); value.thumb_len = car_info->snapLen; }能否像这样去解析else if (motion.obj_type == SMART_DATA_OBJECT_TYPE_VEHICLE) { SMART_DATA_OI_VEHICLE_RECOGNITION_VALUE_S *vehicle = malloc(sizeof(*vehicle)); vehicle->type_sedan = *(p_buf + offset++); memcpy(&vehicle->timestamp_start, p_buf + offset, sizeof(uint64_t)); vehicle->timestamp_start = be64toh(vehicle->timestamp_start); offset += sizeof(uint64_t); memcpy(&vehicle->timestamp_end, p_buf + offset, sizeof(uint64_t)); vehicle->timestamp_end = be64toh(vehicle->timestamp_end); offset += sizeof(uint64_t); memcpy(&vehicle->thumb_len, p_buf + offset, sizeof(uint32_t)); vehicle->thumb_len = ntohl(vehicle->thumb_len); offset += sizeof(uint32_t); if (vehicle->thumb_len > 0) { vehicle->thumb = malloc(vehicle->thumb_len); memcpy(vehicle->thumb, p_buf + offset, vehicle->thumb_len); offset += vehicle->thumb_len; } recognition = vehicle; thumb_len = vehicle->thumb_len; thumb = vehicle->thumb; start_time = vehicle->timestamp_start; end_time = vehicle->timestamp_end; special_attr = vehicle->type_sedan;
10-18
优化void wifi_uart_service(void) { #error "请直接在main函数的while(1){}中添加wifi_uart_service(),调用该函数不要加任何条件判断,完成后删除该行" static unsigned short rx_in = 0; unsigned short offset = 0; unsigned short rx_value_len = 0; while((rx_in < sizeof(wifi_data_process_buf)) && with_data_rxbuff() > 0) { wifi_data_process_buf[rx_in ++] = take_byte_rxbuff(); } if(rx_in < PROTOCOL_HEAD) return; while((rx_in - offset) >= PROTOCOL_HEAD) { if(wifi_data_process_buf[offset + HEAD_FIRST] != FRAME_FIRST) { offset ++; continue; } if(wifi_data_process_buf[offset + HEAD_SECOND] != FRAME_SECOND) { offset ++; continue; } if(wifi_data_process_buf[offset + PROTOCOL_VERSION] != MCU_RX_VER) { offset += 2; continue; } rx_value_len = wifi_data_process_buf[offset + LENGTH_HIGH] * 0x100; rx_value_len += (wifi_data_process_buf[offset + LENGTH_LOW] + PROTOCOL_HEAD); if(rx_value_len > sizeof(wifi_data_process_buf) + PROTOCOL_HEAD) { offset += 3; continue; } if((rx_in - offset) < rx_value_len) { break; } //数据接收完成 if(get_check_sum((unsigned char *)wifi_data_process_buf + offset,rx_value_len - 1) != wifi_data_process_buf[offset + rx_value_len - 1]) { //校验出错 //printf("crc error (crc:0x%X but data:0x%X)\r\n",get_check_sum((unsigned char *)wifi_data_process_buf + offset,rx_value_len - 1),wifi_data_process_buf[offset + rx_value_len - 1]); offset += 3; continue; } data_handle(offset); offset += rx_value_len; }//end while rx_in -= offset; if(rx_in > 0) { my_memcpy((char *)wifi_data_process_buf, (const char *)wifi_data_process_buf + offset, rx_in); } } bool unpack_byte(unpack_context_t *context, uint8_t byte, uart_frame_t *frame) { static unsigned short rx_in = 0; unsigned short offset = 0; unsigned short rx_value_len = 0; unsigned short step = 0; if((rx_in < sizeof(wifi_data_process_buf)) && with_data_rxbuff() >= 7) { wifi_data_process_buf[rx_in ++] = take_byte_rxbuff(); } if(rx_in > PROTOCOL_HEAD) { switch (step) { case STATE_HEADER_HIGH: if(wifi_data_process_buf[step + HEAD_FIRST] != FRAME_HEADER_HIGH) { offset ++; continue; } if (byte == FRAME_HEADER_HIGH) { context->state = STATE_HEADER_LOW; context->frame_buf[0] = byte; } break; case STATE_HEADER_LOW: if (byte == FRAME_HEADER_LOW) { context->state = STATE_LENGTH; context->frame_buf[1] = byte; } else { context->state = STATE_HEADER_HIGH; // 重新开始 } break; case STATE_LENGTH: if (byte <= MAX_DATA_LEN) { context->data_len = byte; context->data_count = 0; context->state = STATE_DATA; context->frame_buf[2] = byte; } else { context->state = STATE_HEADER_HIGH; // 长度错误,重新开始 } break; case STATE_DATA: context->frame_buf[3 + context->data_count] = byte; context->data_count++; if (context->data_count >= context->data_len) { context->state = STATE_CRC; } break; case STATE_CRC: context->frame_buf[3 + context->data_len] = byte; // 检查CRC uint8_t crc_calc = calculate_crc(&context->frame_buf[2], context->data_len + 1); // 长度+数据 if (crc_calc == byte) { // 解包成功,填充frame frame->header[0] = FRAME_HEADER_HIGH; frame->header[1] = FRAME_HEADER_LOW; frame->length = context->data_len; for (uint8_t i = 0; i < context->data_len; i++) { frame->data[i] = context->frame_buf[3 + i]; } frame->crc = byte; context->state = STATE_HEADER_HIGH; // 重置状态机 return true; } else { context->state = STATE_HEADER_HIGH; // CRC错误,重新开始 } break; default: context->state = STATE_HEADER_HIGH; // 未知状态,重新开始 break; } } return false; }
最新发布
12-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值