简体   繁体   中英

Convert bytearray to string in specific case

I wrote a little app in Python 2.7 that compares an MSSQL and an Sqlite database and I have some problem with the binary datatypes ( binary , varbinary , image , etc). On the server side is an application which was written in C# that sends the data to a mobile device, but first converts the binary types to hex.
For example:

In the database there's a column with datatype binary(50) and stores information like this:

0x81B5ED7992000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

The C# app converts it to hex with this code:

var sb = new StringBuilder();
sb.Append("'");
byte[] data = Encoding.UTF8.GetBytes(value.ToString());
foreach (byte b in data)
{
    sb.Append(string.Format("{0:x2}", b));
}
sb.Append("'");
valuesStringBuilder.Append(sb.ToString());

The variables contain these data:

value
{byte[50]}
    [0]: 129
    [1]: 181
    [2]: 237
    [3]: 121
    [4]: 146
    [5]: 0
    [6]: 0
    [7]: 0
    [8]: 0
    [9]: 0
    [10]: 0
    [11]: 0
    [12]: 0
    [13]: 0
    [14]: 0
    [15]: 0
    [16]: 0
    [17]: 0
    [18]: 0
    [19]: 0
    [20]: 0
    [21]: 0
    [22]: 0
    [23]: 0
    [24]: 0
    [25]: 0
    [26]: 0
    [27]: 0
    [28]: 0
    [29]: 0
    [30]: 0
    [31]: 0
    [32]: 0
    [33]: 0
    [34]: 0
    [35]: 0
    [36]: 0
    [37]: 0
    [38]: 0
    [39]: 0
    [40]: 0
    [41]: 0
    [42]: 0
    [43]: 0
    [44]: 0
    [45]: 0
    [46]: 0
    [47]: 0
    [48]: 0
    [49]: 0

value.ToString()
"System.Byte[]"

data
{byte[13]}
    [0]: 83
    [1]: 121
    [2]: 115
    [3]: 116
    [4]: 101
    [5]: 109
    [6]: 46
    [7]: 66
    [8]: 121
    [9]: 116
    [10]: 101
    [11]: 91
    [12]: 93

sb
{'53797374656d2e427974655b5d'}
    Capacity: 32
    Length: 28
    MaxCapacity: 2147483647

In my python app I am using the pyodbc library. From the MSSQL database, I get the data as a bytearray:

bytearray(b'\x81\xb5\xedy\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

From the Sqlite database I can read as a unicode string:

u'53797374656d2e427974655b5d'

So I need to convert that bytearray to the exact same format as the unicode string to compare them. I've tried to find a solution in Stackoverflow, but I always get a completely different string than I expected.

Does anybody know how can I do this?

Here is an example:

using System;
using System.Data;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.richTextBox1.Text = "I am a string";
}

private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "Convert to Hex")
{
this.LocalString = this.richTextBox1.Text;

ConvertToByteArray(this.LocalString);

this.button1.Text = "Convert to String";
}
else
{
string HexString = this.richTextBox1.Text.Trim();
HexString = HexString.Replace("'", "");

ConvertToString(HexString);

this.button1.Text = "Convert to Hex";
}
}

private byte[] LocalByteArray = new byte[50];

private string LocalString = string.Empty;

private void ConvertToByteArray(string myString)
{
// Convert the String passed to a Byte Array for Hex Conversion...
this.LocalByteArray = Encoding.UTF8.GetBytes(myString);

// Create a new StringBuilder Reference...
StringBuilder stringBuilder = new StringBuilder();

// Append Start Char...
stringBuilder.Append("'");

// Loop through and append each converted Byte (Converted to Hex) to the String that we are building...
foreach (byte b in this.LocalByteArray)
{
stringBuilder.Append(b.ToString("X2"));
}

// Append End Char...
stringBuilder.Append("'");

// Assign the String to TextBox...
this.richTextBox1.Text = stringBuilder.ToString();

}

private void ConvertToString(string HexString)
{
// Create a new StringBuilder Reference...
StringBuilder stringBuilder = new StringBuilder();

// Loop through and append each converted Byte (Converted from Hex) to the String that we are building...
for (int i = 0; i <= HexString.Length - 2; i += 2)
{
stringBuilder.Append(Convert.ToString(Convert.ToChar(Int32.Parse(HexString.Substring(i, 2), System.Globalization.NumberStyles.HexNumber))));
}

// Assign the String to TextBox...
this.richTextBox1.Text = stringBuilder.ToString();
}
}
}

Maybe this will help you. Its a little hacked and could be tidyied up a fair bit. But gives you an idea.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM