diff --git a/S7.Net.UnitTest/ConvertersUnitTest.cs b/S7.Net.UnitTest/ConvertersUnitTest.cs index abbe4ac..e14fbab 100644 --- a/S7.Net.UnitTest/ConvertersUnitTest.cs +++ b/S7.Net.UnitTest/ConvertersUnitTest.cs @@ -24,5 +24,21 @@ namespace S7.Net.UnitTest Assert.IsFalse(dummyByte.SelectBit(7)); } + + [TestMethod] + public void T01_TestSetBit() + { + byte dummyByte = 0xAA; // 1010 1010 + dummyByte.SetBit(0, true); + dummyByte.SetBit(1, false); + dummyByte.SetBit(2, true); + dummyByte.SetBit(3, false); + Assert.AreEqual(dummyByte, 0xA5);// 1010 0101 + dummyByte.SetBit(4, true); + dummyByte.SetBit(5, true); + dummyByte.SetBit(6, true); + dummyByte.SetBit(7, true); + Assert.AreEqual(dummyByte, 0xF5);// 1111 0101 + } } } diff --git a/S7.Net/Conversion.cs b/S7.Net/Conversion.cs index 44f9e25..2c61f02 100644 --- a/S7.Net/Conversion.cs +++ b/S7.Net/Conversion.cs @@ -151,6 +151,51 @@ namespace S7.Net return (result != 0); } + /// + /// Helper to set a bit value to the given byte at the bit index. + /// + /// + /// + /// + public static void SetBit(this ref byte data, int bitPosition, bool value) + { + if (bitPosition < 0 || bitPosition > 7) + { + return; + } + + if (value) + { + switch (bitPosition) + { + case 0: data |= 0x01; return; + case 1: data |= 0x02; return; + case 2: data |= 0x04; return; + case 3: data |= 0x08; return; + case 4: data |= 0x10; return; + case 5: data |= 0x20; return; + case 6: data |= 0x40; return; + case 7: data |= 0x80; return; + default: return; + } + } + else + { + switch (bitPosition) + { + case 0: data &= 0xFE; return; + case 1: data &= 0xFD; return; + case 2: data &= 0xFB; return; + case 3: data &= 0xF7; return; + case 4: data &= 0xEF; return; + case 5: data &= 0xDF; return; + case 6: data &= 0xBF; return; + case 7: data &= 0x7F; return; + default: return; + } + } + } + /// /// Converts from ushort value to short value; it's used to retrieve negative values from words ///