簡體   English   中英

如何將字符串轉換為ushort []

[英]How to convert string to ushort[]

我一直在網上搜尋轉換問題的解決方案,我一直面臨將其寫入RF標簽用戶存儲器的問題。 該API接受ushort[] 我創建了一個接受ASCII輸入作為測試字段的應用。 例如,如果用戶輸入Hurrah ,那么我需要將其轉換為ushort[] { 0x4875, 0x7272, 0x6168} 這是我得到的結果:

    [TestMethod]
    public void AsciiToHexConversionTest()
    {
        IList<ushort> outputList = new List<ushort>();
        var inputStr = "Hurrah";
        IList<char> output = new List<char>();

        char[] values = inputStr.ToCharArray();
        foreach (char letter in values)
        {
            // Get the integral value of the character. 
            var value = Convert.ToInt32(letter);

            // Convert the decimal value to a hexadecimal value in string form. 
            // uncommenting this line results in an error, and I cant figure out how to convert int to hex without it being a string
            //output.Add(string.Format("{0:X}", value));

        }

        // use bitwise or to package two bytes to a ushort value
        for (int i = 0; i < output.ToArray().Length; i++)
        {
            outputList.Add((ushort)((output[i] << 8) | output[i + 1]));
        }

        Assert.AreEqual(outputList, "487572726168");

    }

任何指針將不勝感激。

更新資料

我認為您認為數字可以是十進制,二進制或十六進制等。但這不是它的工作原理。 數字是指定幅度的數值-十進制與十六進制就是表示這些值的方式。 因此, listOfUshorts中的數字具有可以用十六進制或任何其他基數表示的數值,例如十進制(基礎基數實際上是二進制,既不是十六進制也不是十進制)。

我更新了下面的代碼以證明這一點:在下面插入了新的Debug.Asserts ,在這里我斷言每個項目都是期望的十六進制值。 我還斷言了它們的等效十進制值,然后斷言了十六進制和十進制值彼此直接等效。


原版的

在我看來,就像您基本上擁有它一樣。 但是,唯一需要轉換為十六進制的操作是出於人類可讀比較的目的。 因此,您不需要兩個列表( outputoutputList )。 在內部,只要始終以相同的底數(無論是十進制,十六進制還是其他形式)處理數字值,就可以直接處理它們而無需轉換。

這基本上是相同的東西,但有一些調整。 我沒有將其作為測試裝置,所以沒有Assert.AreEqual我改用Debug.Assert。 我還將顯示/比較的十六進制格式放入其自己的函數中,因為僅出於測試目的才需要它。

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ushort[] result = AsciiToHexConversionTest();

            String outputAsHexString = DecodeToHexString(result);

            Debug.Assert(outputAsHexString == "0x4875,0x7272,0x6168");

            Console.WriteLine(outputAsHexString);
            var readKey = Console.ReadKey();
        }

        public static ushort[] AsciiToHexConversionTest()
        {
            var inputStr = "Hurrah";

            char[] values = inputStr.ToCharArray();
            List<ushort> listOfUshorts = new List<ushort>();

            ushort mask = (ushort)0x00FF;
            for (int i = 0; i < values.Length; i += 2)
            {
                //This approach assumes stuffing the lower 8 bits of two chars into the upper and lower half of a ushort
                ushort first = values[i];
                ushort second = (ushort)(mask & values[i + 1]); //mask is for safety.  Must ensure that top byte is 0 so that | below goes ok.
                listOfUshorts.Add((ushort)((first << 8) | second));
            }

            //demonstrate hexadecimal values
            Debug.Assert(listOfUshorts[0] == 0x4875);
            Debug.Assert(listOfUshorts[1] == 0x7272);
            Debug.Assert(listOfUshorts[2] == 0x6168);

            //demonstrate decimal values
            Debug.Assert(listOfUshorts[0] == 18549);
            Debug.Assert(listOfUshorts[1] == 29298);
            Debug.Assert(listOfUshorts[2] == 24936);

            //directly demonstrate equality of decimal and hexadecimal representations
            Debug.Assert(0x4875 == 18549);
            Debug.Assert(0x7272 == 29298);
            Debug.Assert(0x6168 == 24936);

            return listOfUshorts.ToArray();
        }

        public static string DecodeToHexString(ushort[] list)
        {
            StringBuilder finalOutput = new StringBuilder();
            foreach (var item in list)
            {
                finalOutput.Append(String.Format("0x{0:X},", item));
            }
            finalOutput.Remove(finalOutput.Length - 1, 1); //Remove final comma
            return finalOutput.ToString();
        }
    }
}

@Purusartha,您輸入的ushort []存在錯誤,最終的十六進制值應為0x6168,而不是0x6148。 我這樣做是這樣的:

string inputStr = "Hurrah";
char[] values = inputStr.ToCharArray();
ushort[] packed = new ushort[values.Length / 2];
for (int i = 0; i < values.Length - 1; i+=2)
{
    packed[i / 2] = (ushort)(values[i] * 0x100 + values[i + 1]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM