如何将单个字节转换为字符串

9

我正在使用Visual Studio 2010中的C#语言。

我需要将一个字节(8位int)转换为一个长度为1的字符串。我需要这样做是因为我想将字节值通过串行发送到Arduino。

例如,假设

byte myByte = 49;

49是字符"1"的ASCII编码。我想将myByte转换为myString,这样如果我执行以下操作:

serialport1.Write(myString);

它的功能与以下相同

serialport1.Write("1");

有人能帮我吗?


1
你尝试过使用Write byte重载将字节直接写入串口吗? - 3ullShark
那实际上就是我最终所做的。我只是假设 Write 只能处理字符串。 - Nimaid
6个回答

20
System.Text.Encoding.ASCII.GetString(new[]{myByte})

5
请使用 '(char)mybyte' 或 '((char)mybyte).ToString()'。始终保持简单。 - TomeeNS

2

将文本转换为其对应的Unicode字符。这仅限于几乎等同于ASCII的字符。 - spender
ASCII是Unicode的子集,为什么不支持Unicode呢? - Ilya Kogan
1
主要是因为这不是原帖所要求的 :) - spender

1
一个简单的解决方案是将字节转换为字符,然后将其转换为字符串:
    public string SingleByteToString(byte ಠ_ಠ)
    {
        return ((char)(ಠ_ಠ)).ToString();
    }

1

您确定要使用ASCII吗?

如果是这样,您应该保护自己免受无法转换的数据的影响。一种方法是在数据不是ASCII时抛出异常:

var bytes = new Byte[]{myByte};
var encoding = Encoding.GetEncoding("US-ASCII", new EncoderExceptionFallback(), 
          new DecoderExceptionFallback());
var myString = encoding.GetString(bytes);

System.Text.Encoding.ASCII 会用 ? 替换无法转换的数据,这会悄悄掩盖问题并产生奇怪的症状。


你说得对!我曾经以为,在串口上发送一个字节,需要先转换为ASCII码。然而,这行不通,因为ASCII码只到127,而不是255。我查看了.write的重载型,发现将myByte变成一个数组,如byte[] myByte = {184};,就可以通过这样 serialPort1.write(myByte, 0 ,1); 发送它了。我给你点了赞,但最好的答案是第一个回答。非常感谢! - Nimaid
考虑到这一点:许多人曾经在串口上冲浪并下载二进制文件!您可能还想查看SerialPort.Encoding - Tom Blodget

1

如果有人需要帮助:我在一个循环中需要做类似的事情,但是打印结果字符串时遇到了问题。答案是使用上面spender的解决方案,但要包装以检查空字节再添加到我的字符串中:

string result = "";
foreach (byte myByte in myArray)
{
    if (myByte != (byte)00000000)
    {
        result += System.Text.Encoding.ASCII.GetString(new[]{myByte})
    }
}

0

试试这个:

byte byteVal = 49;
serialport1.Write(System.Convert.ToString(byteValue));

1
似乎返回的是字面字符串。例如,System.Convert.ToString(49) 返回的是 "49",而不是 "1"。 - Nimaid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接