?
Solved

C# - Convert byte[] to bit mask

Posted on 2010-08-26
3
Medium Priority
?
2,606 Views
Last Modified: 2013-12-17
Experts,

I'm writing an web app which contains a large series of Checkboxes on a page.  Once the user selects which options he/she wants I am creating a byte array like this:

//Just using 4 for simplicity:
byte[] options = new byte[4]
options[0] = Convert.ToByte(cbOption1.Checked);
options[1] = Convert.ToByte(cbOption2.Checked);
options[2] = Convert.ToByte(cbOption3.Checked);
options[3] = Convert.ToByte(cbOption4.Checked);

So saying that options 1 and 2 where checked I will end up with a byte[] array looking like this: 1100, which is expected.  I want to convert this to an integer (i.e. a bitmask) which 1100 should equal 12.

So I googled "C# byte[] to int" and most everything comes up using the BitConverter class, but I'm getting some weird values.

One example shows the checking for LittleEndian processor architecture. So:

if(BitConverter.IsLittleEndian)
      Array.Reverse(options);

int optionBitMask = BitConverter.ToInt32(options, 0);

And optionBitMask shows up as 16,842,752.

If I remove the reversing for LittleEndian and just use:

int optionBitMask = BitConverter.ToInt32(options, 0);

Then optionBitMask shows up as 257.

I'm not sure what I'm doing wrong.  How do I get an int value of 12 from a byte[] containing 1100 ?
0
Comment
Question by:P1ST0LPETE
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 2

Assisted Solution

by:eoindevery
eoindevery earned 200 total points
ID: 33534762
You should use BitArrays instead of ByteArrays


> How do I get an int value of 12 from a byte[] containing 1100 ?

using System.Collections;

---------------------------------------

BitArray ba = new BitArray(4);
            ba.Set(3, true);
            ba.Set(2, true);
            ba.Set(1, false);
            ba.Set(0, false);
            //ba= 1100

            int[] array = new int[1];
            ba.CopyTo(array, 0);
            Console.WriteLine(array[0]);

-> will give you 12
0
 
LVL 75

Accepted Solution

by:
käµfm³d   👽 earned 1800 total points
ID: 33534835
You're storing "bit" values in an entire byte for each position. You would need to treat each position as a bit rather than a byte. You can do so by working with the value of each byte and using a combination of shift and bitwise-or operations:
byte[] data = new byte[] { 1, 1, 0, 0 };
int result = 0;

for (int i = data.Length - 1; i >= 0; i--)
{
    result |= (data[i] << (data.Length - (i + 1)));
}

Console.WriteLine(result);

Open in new window

0
 
LVL 10

Author Comment

by:P1ST0LPETE
ID: 33535410
Thanks guys, was working on the following when I read your post:

private int BytesToInt(byte[] bytes)
{
        int result = 0;

        for (int i = 0; i < bytes.Length; i++)
        {
                result += bytes[i] << i;
        }

        return result;
}

So I was close, but obviously missing some crucial steps that kaufmed cleared up.  Also, had forgotten about the BitArray as there is no "bit" data type - well there's bool, but that's not exactly a bit. You know what i mean.
0

Featured Post

Interactive Way of Training for the AWS CSA Exam

An interactive way of learning that will help you visualize core concepts so that you can be more effective when taking your AWS certification exam.  Built for students by a student to help them understand the concepts that they are being taught.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
In this video, Percona Solutions Engineer Barrett Chambers discusses some of the basic syntax differences between MySQL and MongoDB. To learn more check out our webinar on MongoDB administration for MySQL DBA: https://www.percona.com/resources/we…
How to fix incompatible JVM issue while installing Eclipse While installing Eclipse in windows, got one error like above and unable to proceed with the installation. This video describes how to successfully install Eclipse. How to solve incompa…
Suggested Courses

752 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question