简体   繁体   English

将十六进制字符串(从WPF文本框)转换为字节

[英]Converting a Hex String (from WPF TextBox) into byte

I write small WPF application. 我编写小型WPF应用程序。 In my app I have one field called Seq which is actually the byte data. 在我的应用程序中,我有一个名为Seq字段,它实际上是字节数据。

So Seq field should get updated via TextBox of the WPF application. 因此,应该通过WPF应用程序的TextBox更新Seq字段。 But Text string will be typed in Hex format without leading 0x. 但是文本字符串将以十六进制格式键入,且不以0x开头。

Basically I need to write down the algorithm to complete the set method of Seq to set only one byte of data. 基本上,我需要写下算法以完成Seq的set方法,以仅设置一个字节的数据。

Object class which gets updated via text box: 通过文本框更新的对象类:

public class WProtocol {
     private byte _seq
     public byte Seq {
         get {
             return _seq;
         }
         set {
             _seq = value;
         }
     }
 }

WFrameWindow.xaml.cs : WFrameWindow.xaml.cs

public partial class WFrameWindow: Window {
    WProtocol m_WProtocol = new WProtocol();
    public WFrameWindow() {
        InitializeComponent();
        this.DataContext = m_WProtocol;
    }
}

Snippet from WFrameWindow.xaml to show binding the of the source: WFrameWindow.xaml代码片段,用于显示源代码的绑定:

<TextBox HorizontalAlignment="Left" Height="24" Margin="115,26,0,0" TextWrapping="Wrap" Text="{***Binding Seq,Mode=OneWayToSource , UpdateSourceTrigger=PropertyChanged***}" VerticalAlignment="Top" Width="99" FontSize="9" FontFamily="Arial"/>

Your solution would be; 您的解决方案是;

    private string _seq_string;
    public string SeqString
    {
        get { return _seq_string; }
        set
        {
            _seq_string = value;
            SeqBytes = StringToByteArray(value); 

        }
    }

    public byte[] SeqBytes {  get; set; }


    public static byte[] StringToByteArray(string hex)
    {
        return Enumerable.Range(0, hex.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                         .ToArray();
    }

and XAML code would be: 和XAML代码将是:

<TextBox HorizontalAlignment="Left" Height="24" Margin="115,26,0,0" TextWrapping="Wrap" Text="{***Binding SeqString,Mode=OneWayToSource , UpdateSourceTrigger=PropertyChanged***}" VerticalAlignment="Top" Width="99" FontSize="9" FontFamily="Arial"/>

My proposed answer is using a converter instead of code in the ViewModel: 我建议的答案是使用转换器而不是ViewModel中的代码:

The XamlCode: XamlCode:

 <TextBox HorizontalAlignment="Left" Height="24" Margin="115,26,0,0" TextWrapping="Wrap" 
          Text="{Binding Seq, Converter={StaticResource StringToByteConverter}, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
          VerticalAlignment="Top" Width="99" FontSize="9" FontFamily="Arial"/>

The Converter: 转换器:

class StringToByteConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is String)
        {
            string valueTyped = (String)value;

            if (String.IsNullOrEmpty(valueTyped) == false && valueTyped.Length <= 2)
                return System.Convert.ToByte(valueTyped, 16);
        }

        return new byte();

    }
}

To use the converter, add it in the Resources: 要使用转换器,请将其添加到参考资料中:

...
xmlns:local="clr-namespace:MyProject"
...

<Application.Resources>
    <local:StringToByteConverter x:Key="StringToByteConverter"/>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM