繁体   English   中英

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

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

我编写小型WPF应用程序。 在我的应用程序中,我有一个名为Seq字段,它实际上是字节数据。

因此,应该通过WPF应用程序的TextBox更新Seq字段。 但是文本字符串将以十六进制格式键入,且不以0x开头。

基本上,我需要写下算法以完成Seq的set方法,以仅设置一个字节的数据。

通过文本框更新的对象类:

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

WFrameWindow.xaml.cs

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

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"/>

您的解决方案是;

    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();
    }

和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"/>

我建议的答案是使用转换器而不是ViewModel中的代码:

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"/>

转换器:

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();

    }
}

要使用转换器,请将其添加到参考资料中:

...
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