Метод 1: использование типа bytes
function getStringLength(bytes memory str) public pure returns (uint) {
return str.length;
}
В Solidity строки представлены как массивы байтов. Тип bytesимеет встроенное свойство length, которое возвращает количество байтов в строке.
Метод 2: использование bytes32
function getStringLength(string memory str) public pure returns (uint) {
bytes32 strBytes = bytes32(uint256(keccak256(abi.encodePacked(str))));
uint length = 0;
while (strBytes[length] != 0) {
length++;
}
return length;
}
В этом методе мы преобразуем строку в тип bytes32, который можно рассматривать как массив байтов. Затем мы перебираем байты, пока не найдем нулевой терминатор (байт со значением 0), указывающий на конец строки.
Метод 3: использование bytesи abi.encodePacked
function getStringLength(string memory str) public pure returns (uint) {
return bytes(str).length;
}
В этом методе мы преобразуем строку в тип bytesи напрямую обращаемся к ее свойству length.
Обратите внимание, что третий метод более экономичен по газу по сравнению со вторым методом. Эффективность использования газа является важным фактором в Solidity для оптимизации затрат на выполнение смарт-контрактов в сети Ethereum.