为什么我没有通过此字节数组转换获得实际的字符串值?

时间:2014-06-11 19:26:02

标签: c# bytearray zebra-printers motorola opennetcf

我正在尝试通过串口向打印机发送“getvar”命令,并接收响应,但是我在尝试验证我发送的内容时收到的是什么,收到的是:“系统.BYTE []“

这是我的代码:

const string quote = "\"";
. . .
string getDeviceLang = string.Format("! U1 getvar {0}device.languages{0}", quote);
. . .
String deviceLanguage = PrintUtils.GetSettingFromPrinter(getDeviceLang);
. . .
MessageBox.Show(deviceLanguage); // <= this shows "System.Byte[]"

public static string GetSettingFromPrinter(string cmd)
{
    string setting = string.Empty;
    try
    {
        BasicPortSettings bps = new BasicPortSettings();
        bps.BaudRate = BaudRates.CBR_19200;
        bps.Parity = OpenNETCF.IO.Serial.Parity.none;
        bps.StopBits = OpenNETCF.IO.Serial.StopBits.one; 

        Port serialPort = new Port("COM1:", bps);
        serialPort.Open();
        byte[] outputBytes = Encoding.ASCII.GetBytes(cmd);
        MessageBox.Show(Convert.ToString(outputBytes)); // <= this shows "System.Byte[]"
        serialPort.Output = outputBytes;
        byte[] inputBytes = serialPort.Input;
        setting = Convert.ToString(inputBytes);

        serialPort.Close();
        return setting;
    }
    catch (Exception x)
    {
        MessageBox.Show(x.ToString());
        return setting;
    }
}

我需要做什么才能真正看到我正在传递和接收的字符串,而不仅仅是数据类型的字符串表示?

更新

看起来是否合适:

setting = System.Text.Encoding.ASCII.GetString(
    inputBytes, 0, inputBytes.Length);

?它至少可以编译,但是......

更新2

好的,这段代码:

public static string GetSettingFromPrinter(string cmd)
{
    string setting = string.Empty;
    try
    {
        BasicPortSettings bps = new BasicPortSettings();
        bps.BaudRate = BaudRates.CBR_19200;
        bps.Parity = OpenNETCF.IO.Serial.Parity.none;
        bps.StopBits = OpenNETCF.IO.Serial.StopBits.one; 

        Port serialPort = new Port("COM1:", bps);
        serialPort.Open();
        byte[] sendBytes = Encoding.ASCII.GetBytes(cmd);
        MessageBox.Show(Encoding.ASCII.GetString(sendBytes, 0, 
                        sendBytes.Length));
        serialPort.Output = sendBytes;
        byte[] receiveBytes = serialPort.Input;
        setting = GetString(receiveBytes);
        serialPort.Close();
        return setting;
            }
    catch (Exception x)
    {
    MessageBox.Show(x.ToString());
    return setting;
    }
}

...确实在这里返回了预期的val(!U1 getvar“device.language”):

MessageBox.Show(Encoding.ASCII.GetString(sendBytes, 0, sendBytes.Length));

...但这里仍然是一个空字符串:

        String deviceLanguage = PrintUtils.GetSettingFromPrinter(getDeviceLang);
        MessageBox.Show(deviceLanguage);

// Helper function, from http://stackoverflow.com/questions/472906/converting-a-string-to-byte-array
static string GetString(byte[] bytes)
{
    char[] chars = new char[bytes.Length / 2];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    return new string(chars);
}

也许“sendBytes”根本就没有被发送,这就是为什么在receiveBytes中没有响应/什么......

2 个答案:

答案 0 :(得分:2)

如果您想以十六进制形式查看字节,请使用BitConverter.ToString(byte[])。这将为您提供输出,例如&#34; 01-56-AF&#34;。

如果您想要文字 - 嗯,您已经将其作为cmd - 但一般情况下,要将byte[]转换为其代表的文字,请使用{{1}使用合适的编码。

从根本上说,没有&#34;实际字符串值&#34;对于一个字节数组 - 有许多将任意字节数组转换为文本的不同方法,你需要为你的上下文选择正确的方法。

答案 1 :(得分:1)

更改

setting = Convert.ToString(inputBytes);

setting = System.Text.Encoding.ASCII.GetString(inputBytes);