Solidity

如何從 bytes8 更改第 5 和第 6 字節

  • March 17, 2022

嗨,伙計們
我如何從這個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
 }

引用自:https://ethereum.stackexchange.com/questions/124052