将字节转换为特殊字符Java

时间:2013-12-21 23:51:32

标签: java android string bluetooth character

我希望通过蓝牙发送任何值,任意i值0-255,但我无法将此值转换为字符串中的char。我尝试了几种不同的方法,但没有成功。

int a= 240 ;
char z=(char)a;
mConnectedThread.write("START"+"\240"+","+"\0240"+","+"\030"+","+Integer.toString(a)+","+z+","+"\0f1"+"STOP");

我得到了这个(左边 - 十进制值,ASCII字符中的右边值):

  • 83'S'
  • 84-'T'
  • 65-'A'
  • 82-'R'
  • 84-'T'
  • 194-'A'
  • 160-''
  • 44-','
  • 20 - '\ 024'
  • 48 '0'
  • 44 - ''
  • 24 - '\ 030'
  • 44 - ''
  • 50 '2'
  • 52-'4'
  • 48 '0'
  • 44 - ''
  • 195-'A'
  • 176- '°'
  • 44','
  • 0 - '\ 0'
  • 102-'f'
  • 49-'1'
  • 83'S'
  • 84-'T'
  • 79-'O'
  • 80-'P'

当我发送\030时,我会在一个字符中收到24-'\30',但我无法发送更大的数字。

所以我的问题是:如何在一个字符串字符中设置/转换0-255范围内的任何值。我不需要显示它,这并不重要。

2 个答案:

答案 0 :(得分:0)

<强>被修改

如果您只想将字符串写入流而不将其转换为字节,则可以使用BufferedWriter:

OutputStreamWriter osw = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(osw);
bufferedWriter.write("some string");

确保您了解api中的flush和close方法: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html

这在java中非常标准,用较高级别的Reader / Writer对象包装低级输入/输出流对象,以便访问更方便的方法。

原始回答

您可以使用特定字符集构造String来解码字节: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte[], java.nio.charset.Charset)

US-ASCII可能足以满足您的使用需求 http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html

所以你可以像这样构造一个字节数组的字符串:

new String(byteArray, StandardCharsets.US_ASCII);

答案 1 :(得分:0)

我接收并发送byte []数据,并且它运行良好,但我认为makin这个字符串会更好,bocouse当我制作数据表时它看起来像这样

byte[] dat = new byte[50];
        dat[i++] = (byte) '!';
        dat[i++] = (byte) '!';
        dat[i++] = (byte) 0xf0;
        dat[i++] = (byte) 0xf0;
        dat[i++] = (byte) SET_COUPLING;
        dat[i++] = (byte) (coupling + 64*this.name);
        dat[i++] = (byte) 0xf0;
        dat[i++] = (byte) 0xf0;
        dat[i++] = (byte)SET_MULTI;

我只是想找到更好的方法来构造这个命令。 我的发送功能:

void write(String str)
{
    if (STATE != CONNECTED)
        return;
    try
    {
        mmOutStream.write(str.getBytes());
    } catch (IOException e)
    {
        synchronized (MainActivity.this)
        {
            btDisconnect();
            changeState(CONNECTION_ERROR);
            mConnectedThread = null;
        }
    }
}

或使用byte []的第二个写函数:

void write(byte[] data)
{
    if (STATE != CONNECTED)
        return;

    try
    {
        mmOutStream.write(data);
    } catch (IOException e)
    {
        handler.post(new Runnable()
        {
            public void run()
            {
                btDisconnect();
                changeState(CONNECTION_ERROR);
                mConnectedThread = null;
            }
        });
    }
}

我看到我使用 mmOutStream.write(str.getBytes()); 将此字符串转换为byte [],但我认为制作字符串命令然后转换int byte []是更优雅的方法。 我认为这是在sprintf中实现这一点的简单方法

sprintf(str,"%4.1f\xdf""C", temp);

其中“\ xdf”在一个字节中只有223,当我把它放入字母数字显示时是度数标记