none
[vb2012]如何輸入一串hex數值後,以ASCII的方式儲存? RRS feed

  • 問題

  • 我知道要儲存一般的文字檔是用這個

    My.Computer.FileSystem.WriteAllText("test.txt","text",True)

    但我想要以輸入hex的方式來儲存

    例如我輸入30
    儲存後的檔案內容會是0

    我輸入30 31 32
    儲存後的檔案內容會是012

    我輸入30 20 31 20 32
    儲存後的檔案內容會是0 1 2

    版本是visual studio 2012

    2013年6月2日 上午 07:26

解答

  • 將 Hex 轉成 byte value 後再存檔

    Hex 是給人類看的,不是給電腦看的。

    2013年6月2日 上午 07:50
  • 因為有些碼不能直接轉可見字元, 轉來轉去就會出包, 不要直接轉 ASCII, 轉 Base64String

    Dim b As Byte() = New Byte() {&H4, &H8, &H5B, &H9, &H69, &H2, &HC0, &H3, &H69, &H2, &H20, &H2, &H69, &H2, &H80, &H7, &H69, &H2, &H38, &H4}
    		Dim s As String = Convert.ToBase64String(b)
    		MessageBox.Show(s)
    
    		Dim b2 As Byte() = Convert.FromBase64String(s)
    		MessageBox.Show(BitConverter.ToString(b2))


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年6月2日 上午 09:33
    版主
  • 我記得ASCII就是拿來表示存英數字跟一些符號,只有0~127,超過127的用ASCII編碼去編就會掉字了阿..資料內容不是ASCII的狀況下,一定要存文字檔就是要用別的編法方式去編,不然就是hex byte的值直接就寫進去了。

    像是hex(&HAA)傳回的是字串AA,就直接把AA寫進檔案,讀的時候再轉回來。byte array要直接轉hex可以參考下面這個

    http://msdn.microsoft.com/zh-tw/library/system.bitconverter(v=vs.80).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-4


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    2013年6月3日 上午 02:19
    版主
  • 以下參考自 ProgrammingVolunteer 前輩的程式碼:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            AppendText("30")                '-> "0"
    
            AppendText("30 31 32")          '-> "012"
    
            AppendText("30 20 31 20 32")    '-> "0 1 2"
    
        End Sub
    
        Private Sub AppendText(ByVal OrgStr As String)
            Dim SB As New System.Text.StringBuilder
    
            For Each SS In OrgStr.Split(" ")
                SB.Append(Chr(Convert.ToInt32(SS, 16)))
            Next
    
            IO.File.AppendAllText("c:\test.txt", SB.ToString & vbCrLf)
        End Sub
    

    2013年6月3日 上午 05:14

所有回覆

  • 將 Hex 轉成 byte value 後再存檔

    Hex 是給人類看的,不是給電腦看的。

    2013年6月2日 上午 07:50
  • system.text.encoding.ascii.getstring ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年6月2日 上午 08:11
    版主
  • 做法:

    把十六进制转化成10进制,然后转化成char类型,最后存储。

    string s = "30 31 32";
                //转化成字符串,空格
                string[] strings = s.Split(' ');
                StringBuilder sbu = new StringBuilder();
                foreach (var item in strings)
                {
                    sbu.Append(Convert.ToChar(Convert.ToInt32(item16)));
                }
    //保存sbu到文本文件中             Console.WriteLine(sbu.ToString());


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月2日 上午 08:26
  • Dim b As Byte() = New Byte() {&H30, &H20, &H31, &H20, &H32}
    		Dim s As String = System.Text.Encoding.ASCII.GetString(b)
    		MessageBox.Show(s)

    這樣 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 abc1236762 2013年6月2日 上午 09:04
    • 已取消標示為解答 abc1236762 2013年6月2日 上午 09:17
    2013年6月2日 上午 08:37
    版主
  • Dim b As Byte() = New Byte() {&H30, &H20, &H31, &H20, &H32}
    		Dim s As String = System.Text.Encoding.ASCII.GetString(b)
    		MessageBox.Show(s)

    這樣 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    Dim b As Byte() = New Byte() {&H4, &H8, &H5B, &H9, &H69, &H2, &HC0, &H3, &H69, &H2, &H20, &H2, &H69, &H2, &H80, &H7, &H69, &H2, &H38, &H4}
            Dim s As String = System.Text.Encoding.ASCII.GetString(b)
            My.Computer.FileSystem.WriteAllText("data.ini", s, False, System.Text.Encoding.ASCII)
    04 08 5b 09 69 02 c0 03 69 02 20 02 69 02 80 07 69 02 38 04
    我現在這樣寫
    輸出之後的hex卻是這樣
    04 08 5b 09 69 02 3f 03 69 02 20 02 69 02 3f 07 69 02 38 04

    不一樣為什麼?
    2013年6月2日 上午 09:29
  • 做法:

    把十六进制转化成10进制,然后转化成char类型,最后存储。

    string s = "30 31 32";
                //转化成字符串,空格
                string[] strings = s.Split(' ');
                StringBuilder sbu = new StringBuilder();
                foreach (var item in strings)
                {
                    sbu.Append(Convert.ToChar(Convert.ToInt32(item16)));
                }
    //保存sbu到文本文件中             Console.WriteLine(sbu.ToString());


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    我是用vb
    2013年6月2日 上午 09:29
  • 因為有些碼不能直接轉可見字元, 轉來轉去就會出包, 不要直接轉 ASCII, 轉 Base64String

    Dim b As Byte() = New Byte() {&H4, &H8, &H5B, &H9, &H69, &H2, &HC0, &H3, &H69, &H2, &H20, &H2, &H69, &H2, &H80, &H7, &H69, &H2, &H38, &H4}
    		Dim s As String = Convert.ToBase64String(b)
    		MessageBox.Show(s)
    
    		Dim b2 As Byte() = Convert.FromBase64String(s)
    		MessageBox.Show(BitConverter.ToString(b2))


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年6月2日 上午 09:33
    版主
  • 因為有些碼不能直接轉可見字元, 轉來轉去就會出包, 不要直接轉 ASCII, 轉 Base64String

    Dim b As Byte() = New Byte() {&H4, &H8, &H5B, &H9, &H69, &H2, &HC0, &H3, &H69, &H2, &H20, &H2, &H69, &H2, &H80, &H7, &H69, &H2, &H38, &H4}
    		Dim s As String = Convert.ToBase64String(b)
    		MessageBox.Show(s)
    
    		Dim b2 As Byte() = Convert.FromBase64String(s)
    		MessageBox.Show(BitConverter.ToString(b2))


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    但這樣輸出的字元就會是純英數,不是hex
    2013年6月2日 上午 10:53
  • 我記得ASCII就是拿來表示存英數字跟一些符號,只有0~127,超過127的用ASCII編碼去編就會掉字了阿..資料內容不是ASCII的狀況下,一定要存文字檔就是要用別的編法方式去編,不然就是hex byte的值直接就寫進去了。

    像是hex(&HAA)傳回的是字串AA,就直接把AA寫進檔案,讀的時候再轉回來。byte array要直接轉hex可以參考下面這個

    http://msdn.microsoft.com/zh-tw/library/system.bitconverter(v=vs.80).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-4


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    2013年6月3日 上午 02:19
    版主
  • 以下參考自 ProgrammingVolunteer 前輩的程式碼:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            AppendText("30")                '-> "0"
    
            AppendText("30 31 32")          '-> "012"
    
            AppendText("30 20 31 20 32")    '-> "0 1 2"
    
        End Sub
    
        Private Sub AppendText(ByVal OrgStr As String)
            Dim SB As New System.Text.StringBuilder
    
            For Each SS In OrgStr.Split(" ")
                SB.Append(Chr(Convert.ToInt32(SS, 16)))
            Next
    
            IO.File.AppendAllText("c:\test.txt", SB.ToString & vbCrLf)
        End Sub
    

    2013年6月3日 上午 05:14
  • 大大們不好意思小弟差個嘴

    你不會把不一樣的地方個別試試看是如何編碼的喔

    例如用16進位轉看看.....等等的方式啊

    那應該就知道你要的東西哪裡有問題了啊

    不然的話你用ASII的方式在編碼總會遇到

    一些編碼的時候他有可能會採用進位的方式

    轉碼所以才要試試看不同的編碼會有甚麼不一樣

    的地方......OK

    以後有說錯的地方請大大們多多包涵謝謝!!!!!

    2013年6月3日 上午 08:50
  • 以下參考自 ProgrammingVolunteer 前輩的程式碼:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            AppendText("30")                '-> "0"
    
            AppendText("30 31 32")          '-> "012"
    
            AppendText("30 20 31 20 32")    '-> "0 1 2"
    
        End Sub
    
        Private Sub AppendText(ByVal OrgStr As String)
            Dim SB As New System.Text.StringBuilder
    
            For Each SS In OrgStr.Split(" ")
                SB.Append(Chr(Convert.ToInt32(SS, 16)))
            Next
    
            IO.File.AppendAllText("c:\test.txt", SB.ToString & vbCrLf)
        End Sub

    這樣輸入和輸出的結果也是不一樣阿
    而且還變長
    2013年6月3日 上午 09:35
  • 例如我輸入30
    儲存後的檔案內容會是0
    
    我輸入30 31 32
    儲存後的檔案內容會是012
    
    我輸入30 20 31 20 32
    儲存後的檔案內容會是0 1 2

    若上述是錯的, 煩請說明清楚.
    ---

    如果是要複寫而不是附加檔案的話, 把
    IO.File.AppendAllText("c:\test.txt", SB.ToString & vbCrLf)

    改為
    IO.File.WriteAllText("c:\test.txt", SB.ToString)

    • 已編輯 Ader.Chen 2013年6月3日 上午 09:57 補充
    2013年6月3日 上午 09:49
  • 例如我輸入30
    儲存後的檔案內容會是0
    
    我輸入30 31 32
    儲存後的檔案內容會是012
    
    我輸入30 20 31 20 32
    儲存後的檔案內容會是0 1 2

    若上述是錯的, 煩請說明清楚.
    ---

    如果是要複寫而不是附加檔案的話, 把
    IO.File.AppendAllText("c:\test.txt", SB.ToString & vbCrLf)

    改為
    IO.File.WriteAllText("c:\test.txt", SB.ToString)


    輸入
    04 08 5b 09 69 02 c0 03 69 02 20 02 69 02 80 07 69 02 38 04
    輸出(hex)
    04 08 5b 09 69 02 00 03 69 02 20 02 69 02 c2 80 07 69 02 38 04 0d 0a
    2013年6月3日 下午 12:21
  • 這邊有一個儲存 byte() 陣列的程式碼,你可以看看:

    函數 MySaveBinaryFile

    儲存二進位檔案

    當你陣列在宣告 &H 時,他就是一個純數值,純數值預設顯示 10 進位,你要顯示 16 進位可以用 toString / Hex 去轉換成字串,你先把你口中的 16 進位數值,跟你文章中的 16 進位字串分清楚。

    比如說小玉西瓜一台斤重 (10 進位),你要顯示公斤 (16 進位),你需要的是換用公斤的磅秤去量,跟你裝箱 (存檔) 無關,西瓜通常直接放進箱子內,你若是切塊 (編碼) 後放進箱內,當然你拿出來就不再是原來沒切過的西瓜。

    存檔又有分編碼,ANSI/Unicode/UTF-8/Default(big5) 等,在 .Net 中,為了與既有軟體相容,預設是使用 Default ,在繁體中文下就是 big5 。

    另外這邊有其他字串轉換範例:

    函數 ByteToHex 將位元組陣列轉換為16進位字串
    函數 HexToByte 將16進位字串轉換為位元組陣列

    T.L. Cheng

    2013年6月8日 上午 10:23
    版主