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.