Convert bytearray to string in a specific case

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

The database has a column with the binary(50) data type and stores the following information:

 0x81B5ED7992000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

A C # application will convert it to hex 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()); 

Variables contain this 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 application, I am using pyodbc . From the MSSQL database, I get the data as 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 string in Unicode:

 u'53797374656d2e427974655b5d' 

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

Does anyone know how I can do this?

+4
source share
1 answer

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(); } } } 

Perhaps this will help you. It was hacked a little, and it could be spoiled a little. But gives you an idea.

0
source

Source: https://habr.com/ru/post/1447946/


All Articles