一个int由4个字节组成。我怎样才能用一个新字节替换这 4 个字节中的一个。换句话说,我正在寻找一种方法:
int ReplaceByte(int index, int value, byte replaceByte)
{
// implementation
}
例如,如果我有值 FFFFFFFF
(-1),我想用 0A
(10) 替换字节 0
然后我将调用该方法:
替换字节(0,-1,10)
我会喜欢那个方法返回我 FFFFFF0A
我是否必须将 int 转换为字节数组,然后替换我想要的字节,然后再转换回 int?我正在寻找一种有效的方法来做到这一点。我们正在创建一个连接到目标(板)的类似调试器的程序,并且我们非常频繁地更新这些值。
编辑(结果)
感谢您的回答,我比较了这些方法:
结果如下:
注意我的实现是最慢的!
代码如下:
static void Main ( string[ ] args )
{
byte[ ] randomBytes = new byte[ 1024 * 1024 * 512 ];
Random r = new Random( );
r.NextBytes( randomBytes );
Int64 sum;
var now = DateTime.Now;
Console.WriteLine( "Test 1" );
sum = 0;
now = DateTime.Now;
foreach ( var bt in randomBytes )
{
sum += ReplaceByte1( 1 , -1 , bt );
}
Console.WriteLine( "Test 1 finished in {0} seconds \t hash = {1} \n" , ( DateTime.Now - now ).TotalSeconds, sum );
Console.WriteLine( "Test 2" );
sum = 0;
now = DateTime.Now;
foreach ( var bt in randomBytes )
{
sum += ReplaceByte2( 1 , -1 , bt );
}
Console.WriteLine( "Test 2 finished in {0} seconds \t hash = {1} \n" , ( DateTime.Now - now ).TotalSeconds, sum );
Console.WriteLine( "Test 3" );
sum = 0;
now = DateTime.Now;
foreach ( var bt in randomBytes )
{
sum += ReplaceByte3( 1 , -1 , bt );
}
Console.WriteLine( "Test 3 finished in {0} seconds \t hash = {1} \n" , ( DateTime.Now - now ).TotalSeconds , sum );
Console.Read( );
}
// test 1
static int ReplaceByte1 ( int index , int value , byte replaceByte )
{
return ( value & ~( 0xFF << ( index * 8 ) ) ) | ( replaceByte << ( index * 8 ) );
}
// test 2
static int ReplaceByte2 ( int index , int value , byte replaceByte )
{
// how many bits you should shift replaceByte to bring it "in position"
var shiftBits = 8 * index;
// bitwise AND this with value to clear the bits that should become replaceByte
var mask = ~( 0xff << shiftBits );
// clear those bits and then set them to whatever replaceByte is
return value & mask | ( replaceByte << shiftBits );
}
// test 3
static int ReplaceByte3 ( int index , int value , byte replaceByte )
{
var bytes = BitConverter.GetBytes( value );
bytes[ index ] = replaceByte;
return BitConverter.ToInt32( bytes , 0 );
}
最佳答案
不,没有字节数组。这其实很简单。
未测试:
int ReplaceByte(int index, int value, byte replaceByte)
{
return (value & ~(0xFF << (index * 8))) | (replaceByte << (index * 8));
}
首先它清除指定索引处的空间,然后将新值放入该空间。
关于c# - 替换 int 中的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13161285/