1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "proto_reader_help.h" 17 namespace SysTuning { 18 namespace ProtoReader { VarIntDecode(const uint8_t * start,const uint8_t * end,uint64_t * varIntValue)19const uint8_t *VarIntDecode(const uint8_t *start, const uint8_t *end, uint64_t *varIntValue) 20 { 21 const uint8_t *cursor = start; 22 uint64_t temp = 0; 23 uint32_t shift = 0; 24 do { 25 uint8_t currentByte = *cursor++; 26 temp |= static_cast<uint64_t>(currentByte & varIntValueMask) << shift; 27 if (!(currentByte & byteHighestBitMark)) { 28 *varIntValue = temp; 29 return cursor; 30 } 31 shift += varIntValueBits; 32 } while (cursor < end && shift < varIntValueDecodeMaxOffset); 33 *varIntValue = 0; 34 return start; 35 } 36 } // namespace ProtoReader 37 } // namespace SysTuning 38