Почему я не получаю фактическое строковое значение с этим преобразованием байтового массива?

1

Я пытаюсь отправить команду "getvar" на принтер через последовательный порт и получить ответ, но все, что я получаю, пытаясь проверить, что я отправляю, и то, что получено: "System.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
    Вы пытались просто отправить cmd ? Обычный текст вместо байтов?
  • 2
    По сути, Convert.ToString() - это не то, что вам нужно для преобразования двоичного текста в текстовое - вам нужен Encoding.GetString .
Показать ещё 2 комментария
Теги:
zebra-printers
motorola
opennetcf
bytearray

2 ответа

2
Лучший ответ

Если вы хотите увидеть байты в шестнадцатеричной форме, просто используйте BitConverter.ToString(byte[]). Это даст вам выход, такой как "01-56-AF".

Если вы хотите текст - ну, у вас есть это уже как cmd - но в общем случае для преобразования byte[] в текст, который он представляет, используйте Encoding.GetString(bytes) используя подходящую кодировку.

По сути, нет никакого "фактического строкового значения" для байтового массива - существует много разных способов преобразования произвольного массива байтов в текст, и вам нужно выбрать правильный подход для вашего контекста.

1

+ Изменить

setting = Convert.ToString(inputBytes);

в

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

  • 0
    Я получаю: «Никакая перегрузка для метода GetString не принимает аргументов« 1 »»
  • 1
    @ B.ClayShannon, Странно. Он прекрасно компилируется на моей машине.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню