如何從 bytes8 更改第 5 和第 6 字節
嗨,伙計們,
我如何從這個bytes8 0x3FcB875f"0000"ddC4更改第5和第 6 個字節,或者只是到達這個解決方案,其中:最後四個字節(字節 8)是這種方式 0x********“0000ddC4 " 並且前四個字節(bytes8)可以有任何數字,但 !=0 ? bytes8 normal= 0x3FcB875f56beddC4 // 可能的解決方案 // bytes8 conver= 0x3FcB875f0000ddC4 bytes8 anothe= 0x **** 0000ddC4其中 1 個或多個 * 是 != 0
bytes8 另一個範例解決方案=0x000100100000ddC4
bytes8 另一個範例解決方案=0x00a10f000000ddC4
這就是我嘗試的方法:
bytes8 txOriginBytes8= 0x3FcB875f56beddC4;
// 原始8 字節0x3FcB875f56beddC4
bytes2 twoBytes= bytes2(uint16(uint64(txOriginBytes8)));
*// 取最後兩個字節:0xddC4
bytes4 fourBytes=twoBytes;
* // 添加到一個四字節數組:0xddC40000
bytes4 shiftTwoBytes=fourBytes >> 16;
// 右移兩個字節0x0000ddC4
bytes8 toEithBytes=bytes8(uint64(uint32(shiftTwoBytes)));
// 放入一個字節 8 數組0x000000000000ddc4
return toEithBytes;
我想最簡單的方法是將其轉換為字節,進行修改並再次將其轉換回來,如下所示:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.5; contract Example { function changeByte8() public view returns (bytes8) { bytes8 value = 0x3FcB875f56beddC4; // encodePacked the value to get a bytes array bytes memory array = abi.encodePacked(value); // Set 5th and 6th bytes to 0 array[4] = 0x00; array[5] = 0x00; // Ensure that bytes 1 to 4 are != 0 array[0] = 0xFF; array[1] = 0xFF; array[2] = 0xFF; array[3] = 0xFF; // convert back to bytes8 return bytes8(array); // 0xffffffff0000ddc4 } }
如果您正在尋找更多基於位運算符的方法,請告訴我,我將編輯我的答案。
編輯:實際上它只是幾行,所以我也在這裡添加它。(為了清楚起見,我寫了它,您可以通過在使用蒙版時生成蒙版來更簡潔):
function changeByte8bits() public view returns (bytes8) { bytes8 value = 0x3FcB875f56beddC4; // Bit mask to select bytes 1 to 4 bytes8 mask14 = 0xFFFFFFFF00000000; // Bit mask to select bytes 5 to 6 bytes8 mask56 = 0x00000000FFFF0000; // Ensure that all bits in bytes 1 to 4 are set value = value | mask14; // Ensure that all bits in bytes 5 to 6 are unset value = value & ~mask56; return value; // 0xffffffff0000ddc4 }