Joe Almore
Joe Almore

Reputation: 4331

C# - Get Integer Byte Array in String

I have a random integer value which I need to represent in String as a Byte array. For example:

int value = 32;
String strValue = getStringByteArray(value);
Console.WriteLine(strValue); // should write: " \0\0\0"

If value = 11 then getStringByteArray(value) shuld return "\v\0\0\0".

If value = 13 then getStringByteArray(value) shuld return "\r\0\0\0".

And so on.

Any idea on how to implement the method getStringByteArray(int value) in C#?

UPDATE

This is the code that receives the data from the C# NamedPipe Server:

bool CFilePipe::ReadString(int m_handle, string &value)
{
   //--- check for data
   if(WaitForRead(sizeof(int)))
     {
      ResetLastError();
      int size=FileReadInteger(m_handle);
      if(GetLastError()==0)
        {
         //--- check for data
         if(WaitForRead(size))
           {
            value=FileReadString(m_handle,size);
            return(size==StringLen(value));
           }
        }
     }
   //--- failure
   return(false);
}

Upvotes: 1

Views: 4170

Answers (5)

Jon Skeet
Jon Skeet

Reputation: 1502036

Don't take this approach at all. You should be writing to a binary stream of some description - and write the binary data for the length of the packet/message, followed by the message itself. For example:

BinaryWriter writer = new BinaryWriter(stream);
byte[] data = Encoding.UTF8.GetBytes(text);
writer.Write(data.Length);
writer.Write(data);

Then at the other end, you'd use:

BinaryReader reader = new BinaryReader(stream);
int length = reader.ReadInt32();
byte[] data = reader.ReadBytes(length);
string text = Encoding.UTF8.GetString(data);

No need to treat binary data as text at all.

Upvotes: 8

Artem Kulikov
Artem Kulikov

Reputation: 2296

Well. First of all you should get bytes from integer. You can do it with BitConverter:

var bytes = BitConverter.GetBytes(value);

Next, here is three variants. First - if you want to get result in binary format. Just take all your bytes and write as it is:

var str =  string.Concat(bytes.Select(b => Convert.ToString(b, 2)));

Second variant. If you want convert your byte array to hexadecimal string:

var hex = BitConverter.ToString(array).Replace("-","");     

Third variant. Your representation ("\v\0\0\0") - it is simple converting byte to char. Use this:

var s = bytes.Aggregate(string.Empty, (current, t) => current + Convert.ToChar(t));

Upvotes: 2

Dave Mackersie
Dave Mackersie

Reputation: 1061

I think you are saying that you want to convert each byte into a character literal, using escape sequences for the non printable characters.

After converting the integer to 4 bytes, cast to char. Then use Char.IsControl() to identify the non-printing characters. Use the printable char directly, and use a lookup table to find the corresponding escape sequence for each non-printable char.

Upvotes: 1

Nipheris
Nipheris

Reputation: 507

Obviously, you should implement two steps to achieve the goal:

  1. Extract bytes from the integer in the appropriate order (little-endian or big-endian, it's up to you to decide), using bit arithmetics.

  2. Merge extracted bytes into string using the format you need.

Possible implementation:

using System;
using System.Text;

public class Test
{
    public static void Main()
    {
        Int32 value = 5152;
        byte[] bytes = new byte[4];
        for (int i = 0; i < 4; i++)
        {
            bytes[i] = (byte)((value >> i * 8) & 0xFF);
        }

        StringBuilder result = new StringBuilder();
        for (int i = 0; i < 4; i++)
        {
            result.Append("\\" + bytes[i].ToString("X2"));
        }

        Console.WriteLine(result);
    }
}

Ideone snippet: http://ideone.com/wLloo1

Upvotes: 1

John Thompson
John Thompson

Reputation: 386

This should help with that.

class Program
    {
        static void Main(string[] args)
        {
            Random rand = new Random();
            int number = rand.Next(1, 1000);
            byte[] intBytes = BitConverter.GetBytes(number);
            string answer = "";

            for (int i = 0; i < intBytes.Length; i++)
            {
                answer += intBytes[i] + @"\";
            }

            Console.WriteLine(answer);
            Console.WriteLine(number);

            Console.ReadKey();
        }
    }

Upvotes: 1

Related Questions