Nine MVP's Blog

21/08/2006

ผมต้องการแปลง code utf8 ให้เป็นภาษาไทยทำไงครับ

Filed under: Computers and Internet — Nine MVP @ 12:14 am

ผมต้องการแปลง code utf8 ให้เป็นภาษาไทยทำไงครับ

เช่น
มันมีรหัส
0x0e2a0x0e270x0e310x0e2a0x0e140x0e140x0e350x0e040x0e230x0e310x0e1a0x0e0a0x0e320x0e270x0e420x0e250x0e01
 
มันแปลว่าอะไรครับ
ช่วย convert ให้หน่อยได้ไหมครับ
 
ของ โปรแกรม code ด้วยก็ดีนะครับ
ขอบคุณมากครับ
 
 
 
ตอบ :
 
ผมลองเขียนมาให้ มี 2 Function ทำงานร่วมกันครับ
 
1. เอาไว้แบ่งอักษรที่เป็น 0xXXXXX ออกจากกันก่อน เพื่อจะได้ Convert ได้
อันนี้ไว้ spilt ด้วยชุด String ปกติ C# 1.0 จะไม่มี 
 

private string[] SplitString(string testString, string split)

{

    int offset = 0;

    int index = 0;

    int[] offsets = new int[testString.Length + 1];

    while (index < testString.Length)

    {

        int indexOf = testString.IndexOf(split, index);

        if (indexOf != -1)

        {

            offsets[offset++] = indexOf;

            index = (indexOf + split.Length);

        }

        else

        {

            index = testString.Length;

        }

    }

    string[] final = new string[offset + 1];

    if (offset == 0)

    {

        final[0] = testString;

    }

    else

    {

        offset–;

        final[0] = testString.Substring(0, offsets[0]);

        for (int i = 0; i < offset; i++)

        {

            final[i + 1] = testString.Substring(offsets[i] + split.Length, offsets[i + 1] – offsets[i] – split.Length);

        }

        final[offset + 1] = testString.Substring(offsets[offset] + split.Length);

    }

    return final;

}

 
 
2. เอาไว้ Convert UTF charecter ใน Array ที่ได้จากการ Split แล้ว
 

private string getStringFromUTF8(string[] str)

{

    string strResult = "";

    for (int i = 0; i < str.Length – 1; i++)

    {

        if ((str[i].Length > 0) && (str[i] != string.Empty) && (str[i] != null))

        {

            int utfcode = Convert.ToInt32("0x" + str[i].ToString(), 16);

            strResult += (string)char.ConvertFromUtf32(utfcode);

        }

    }

    return strResult;

} 

 
 
 
 
 
How To Use:
 

//ข้อมูลจากตัวอย่างที่ให้มา

string str = "0x0e2a0x0e270x0e310x0e2a0x0e140x0e140x0e350x0e040x0e230x0e310x0e1a0x0e0a0x0e320x0e270x0e420x0e250x0e01";

 
//ตัวแปรที่ต้องใช้รับค่า

string[] aStr;

string decodeStr;

// ทำการแบ่งชุดข้อความด้วย "0x " เพราะเป็น Prefix ที่แน่นอน เช่น 0x0e2a ก็จะได้ 0e2a

aStr = SplitString(str.Trim(), "0x");

//จากนั้นก็ทำการ pass array ที่ได้เข้า Function getStringFromUTF8() ก็จะได้ string ทั้งหมดกลับออกมา

decodeStr = getStringFromUTF8(aStr);

 

MessageBox.Show(decodeStr);

 
***************************************************************************
 
จาก
0x0e2a0x0e270x0e310x0e2a0x0e140x0e140x0e350x0e040x0e230x0e310x0e1a0x0e0a0x0e320x0e270x0e420x0e250x0e01
ผลลัพธ์ที่ได้คือ
สวัสดีชาวโล
 
Advertisements

12/08/2006

การ Release COM Object ออกจาก Memory ของระบบ

Filed under: Uncategorized — Nine MVP @ 9:34 pm

ปกติแล้วบางครั้งอาจจะหลีกเลี่ยงไม่ได้ที่จะต้องใช้ COM object ในโปรแกรมของเรา

เมื่อเรา add COM  เข้ามาในโปรเจ็ค .NET จะทำตัว Wrapper ที่เรียกเป็นทางการว่า Runtime Callable Wrapper (RCW) ห่อหุ่มและให้เราเรียกใช้ COM Object  นั้นได้อย่างง่ายดาย
 
เพียงแต่ว่าหลังจากการสร้างมันขึ้นมาแล้วนั้น หลังจากใช้งานเสร็จ
จะทำลายทิ้งและคืนหน่วยความจำให้ระบบนั้นช่างแสนยากเย็น และเป็นอันตรายค่อนข้างมาก ในกรณีที่เป็นระบบใหญ่ ๆ
เพราะตัวที่จะถูก GC เก็บกวาดนั้นมีเพียงแค่ RCW ซึ่งหากคุณลืมที่จะลด reference count ของ COM Object ให้เหลือค่า 0 นั้น คุณก็จะไม่สามารถเข้าถึงและควบคุมการทำงานของมันได้อีกเลย เพราะ RCW ได้ถูกทำลายทิ้งไปก่อนแล้ว และ COM Object นั้นจะคงอยู่ใน Startup Time ของ Server นั้นไปตลอด
 
ใน .NET 1.0 , 1.1 นั้นเรามี Method ที่จะช่วย repeat ค่าให้ลดลงจน เป็น 0 นั่นคือ

System.Runtime.InteropServices.Marshal.ReleaseComObject()

แต่ method ตัวนี้เราต้อง repeat ค่าใน Loop จนค่าเป็น 0 ดังนี้

 

ตัวอย่าง

If Not Cipher Is Nothing Then

    Do

        If System.Runtime.InteropServices.Marshal.ReleaseComObject(Cipher) = 0 Then

            Exit Do

        End If

    Loop

End If

 

 

แต่ใน .NET 2.0 นั้นเราสามารถสั่งเพียงครั้งเดียวด้วย

System.Runtime.InteropServices.Marshal.FinalReleaseComObject()

ง่าย ๆ ดังนี้

 
ตัวอย่าง
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Cipher)
 
 
 
เมื่อค่า Reference Count เป็น 0 COM object ก็จะถูกทำลายและคืนหน่วยความจำคืนแก่ระบบ  
จบละ  

สร้าง Ping tool แบบง่าย ๆ กับ .NET 2.0

Filed under: Uncategorized — Nine MVP @ 9:32 pm
ใน .Net 2.0 นี้มี Class ต่าง ๆ เพิ่มเข้ามามากมายเลย ซึ่งช่วยให้เราสามารถที่จะเรียกมาใช้งานได้อย่างง่าย ๆ

หลายครั้งที่เราจะเขียนโปรแกรมเพื่อที่จะตรวจสอบ DNS, Host , IP ด้วยการ Ping นั้นลำบากพอสมควร
เราอาจจะเข้าไปใช้ ping ใน Command ของ Windows หรือ อาจจะใช้ Sockets สร้าง Ping tool ขึ้นมา
ซึ่งต้องเขียนเพิ่มเติมอีกพอสมควร
 
มาวันนี้ในกลุ่ม  Namespace System.Net.NetworkInformation มี Ping Class สำเร็จรูปมาให้เราได้ใช้งาน
เพียงแค่ code ไม่กี่บรรทัดเราก็จะได้ Network Utility Tool ในการ Ping กันแล้วครับ
 
จากรูปข้างล่างนี้เราสามารถที่จะเลือกใส่ทั้ง IP Address , HostName, DNS เพื่อทำการ Ping ได้ครับ
 
 
มาดู Code
ที่ผมทำ code ตัวใหญ่ ๆ คือส่วนที่เกี่ยวข้องกับการ Ping ครับ

Imports

System

Imports

System.Threading

Imports

System.Net.NetworkInformation

 

delegate สำหรับการ update ข้อมูลใน Textbox จาก WorkerThread

Public Delegate Sub SetText(ByVal txt As String)

 

Public

Class Form1

‘จำนวนรอบของการ Ping

Private round As Integer

 

‘Update ผลการ Ping ใน Textbox1

Public Sub SetTextBox(ByVal txt As String)

    TextBox1.AppendText(txt)

End Sub

 

‘ป้องกันการ access control ข้าม Thread จาก WorkTThread ไป MainThread

Public Sub CheckUICrossThread(ByVal txt As String)

    If TextBox1.InvokeRequired Then

        Dim d As SetText = New SetText(AddressOf SetTextBox)

        Me.BeginInvoke(d, txt)

    Else

        TextBox1.AppendText(txt)

    End If

End Sub

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    If TextBox2.Text.Length < 1 Then

        Return

    End If

    TextBox1.Clear()

    ‘ใช้ ThreadPool โดย การส่ง method ที่ต้องการให้ทำงานพร้อม parameter ที่เป็น host / ip / dns

    ThreadPool.QueueUserWorkItem(

AddressOf PingHost, TextBox2.Text)

End Sub

 

Public Sub PingHost(ByVal state As Object)

    Try

        ‘สร้าง instance ของ ping class

        Dim p As New Ping

        ‘ตรวจสอบการข้ามThread ส่ง Header detail

        CheckUICrossThread(

"Starting Ping IP: " & state & vbCrLf)

        For i As Integer = 0 To round

            Thread.Sleep(300)

            Dim rep As PingReply = p.Send(state, 100)

            If rep.Status = IPStatus.Success Then

                ‘ตรวจสอบการข้ามThread ส่ง ผลการ Ping

                CheckUICrossThread(

" Success – IP Address: " & state & " Time:" & rep.RoundtripTime.ToString & "ms " & vbCrLf)

            Else

                ‘ตรวจสอบการข้ามThread ส่ง Status อื่น ๆ หากไม่สำเร็จ

                CheckUICrossThread(rep.Status & vbCrLf)

            End If

        Next

    Catch ex As Exception

        ‘ตรวจสอบการข้ามThread ส่ง Error Msg

        CheckUICrossThread(ex.Message)

    End Try

End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

    round =

CInt(ComboBox1.SelectedItem)

End Sub

End Class

 

 
Download Source Code ได้ที่นี่

Blog at WordPress.com.