4

MSSQL と Sqlite データベースを比較する小さなアプリを Python 2.7 で作成しましたが、バイナリ データ型 ( binaryvarbinaryimageなど) に問題があります。サーバー側には、データをモバイル デバイスに送信する C# で記述されたアプリケーションがありますが、最初にバイナリ型を 16 進数に変換します。
例えば:

データベースには、データ型の列があり、次のbinary(50)ような情報が格納されます。

0x81B5ED7992000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

C# アプリは、次のコードでそれを 16 進数に変換します。

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

変数には次のデータが含まれます。

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

私のpythonアプリでは、pyodbcライブラリを使用しています。MSSQL データベースから、データを 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')

Sqlite データベースから、Unicode 文字列として読み取ることができます。

u'53797374656d2e427974655b5d'

したがって、それらを比較するには、そのバイト配列をユニコード文字列とまったく同じ形式に変換する必要があります。Stackoverflow で解決策を見つけようとしましたが、予想とはまったく異なる文字列が常に得られます。

どうすればこれができるか知っている人はいますか?

4

1 に答える 1

0

次に例を示します。

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

多分これはあなたを助けるでしょう。少しハッキングされており、かなり整理することができます。しかし、あなたにアイデアを与えます。

于 2013-02-08T01:58:33.707 に答える