如何将字符串转换为ushort []

时间:2015-04-10 05:25:02

标签: c# .net

我一直在寻找解决我遇到的转换问题的解决方案,我需要将其写入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");

    }

任何指针都会非常感激。

2 个答案:

答案 0 :(得分:1)

<强>更新

我认为您认为数字可以是十进制,二进制或十六进制等。但这不是它的工作原理。数字是指定幅度的数值 - 十进制与十六进制是这些值的表示方式。因此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();
        }
    }
}

答案 1 :(得分:1)

@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]);
}