把bytes 数据拆分
function subbyte(bytes memory self, uint startIndex, uint len) internal pure returns (bytes memory) {
require(startIndex <= self.length && self.length - startIndex >= len);
uint addr = dataPtr(self);
return toBytes(addr + startIndex, len);
}
function dataPtr(bytes memory bts) internal pure returns (uint addr) {
assembly {
addr := add(bts, /BYTES_HEADER_SIZE/32)
}
}
function toBytes(uint addr, uint len) internal pure returns (bytes memory bts) {
bts = new bytes(len);
uint btsptr;
assembly {
btsptr := add(bts, /BYTES_HEADER_SIZE/32)
}
copy(addr, btsptr, len);
}
//拷贝
function copy(uint src, uint dest, uint len) internal pure {
for (; len >= 32; len -= 32) {
assembly {
mstore(dest, mload(src))
}
dest += 32;
src += 32;
}
uint mask = 256 ** (32 - len) - 1;
assembly {
let srcpart := and(mload(src), not(mask))
let destpart := and(mload(dest), mask)
mstore(dest, or(destpart, srcpart))
}
}
字符串截取可以转换为bytes 后截取
bytes memory value = bytes(source);