在c#中将大的数字转换为两个字节

本文关键字:字节 两个 转换 数字 | 更新日期: 2023-09-27 17:49:14

我正试图将一个数字从一个文本框转换成2个字节,然后可以通过串行发送。数字的取值范围是500 ~ -500。我已经有了一个设置,所以我可以简单地发送一个字符串,然后转换为字节。下面是一个例子:

send_serial("137", "1", "244", "128", "0")

文本框编号将在第2和第3个字节

这将使我的Roomba(所有这些代码用于的机器人)以500mm/s的速度前进。发送的第一个数字告诉roomba开车,第2和第3个数字是速度,第4和第5个数字是转弯半径(在2000和-2000之间,也有一个特殊情况,其中32768是直线)。

在c#中将大的数字转换为两个字节

var value = "321";
var shortNumber = Convert.ToInt16(value);
var bytes = BitConverter.GetBytes(shortNumber);

或者,如果您需要大端排序:

var bigEndianBytes = new[]
{
    (byte) (shortNumber >> 8), 
    (byte) (shortNumber & byte.MaxValue)
};

假设您使用System.IO.Ports.SerialPort,您将使用SerialPort.Write(byte[], int, int)来编写发送数据。

如果您的输入是这样的:99,255,您将这样做以提取两个字节:

// Split the string into two parts
string[] strings = textBox1.text.Split(',');
byte byte1, byte2;
// Make sure it has only two parts,
// and parse the string into a byte, safely
if (strings.Length == 2
    && byte.TryParse(strings[0], System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out byte1)
    && byte.TryParse(strings[1], System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out byte2))
{
    // Form the bytes to send
    byte[] bytes_to_send = new byte[] { 137, byte1, byte2, 128, 0 };
    // Writes the data to the serial port.
    serialPort1.Write(bytes_to_send, 0, bytes_to_send.Length);
}
else
{
    // Show some kind of error message?
}

这里我假设你的"字节"是从0到255,这与c#的byte类型相同。我使用byte.TryParsestring解析为byte