0

请理所当然地认为我在每台设备上最多只使用一个 alljoyn 服务

从我目前所掌握的情况来看,这是您定位其他设备的方式:

  1. 您设置了一个众所周知的前缀,它是服务的名称,每个人都知道
  2. 您为每个设备设置一个唯一的后缀

好吧,因为dbus 名称中的所有元素都有某些限制,例如 US-ASCII,你怎么能用法语、希腊语或中文命名设备?

目标是列出所有周围设备及其名称。如果所有设备都有一个简单的英文名称,这很容易,但其他语言甚至特殊字符和空格呢?

4

1 回答 1

1

如果您所指的字符串是简单的名称,我猜它们的长度相对较小,因此性能不是问题

使用下面的代码,您可以对任何 utf8 字符串与英文字母进行编码解码

object LetterConverter {
    private def toTwoLetters(byte: Byte): String = {
      val num = byte + 128;
      //range now from 0 to 255
      val division = num / 26;
      val modulo = num % 26;
      val firstletter = ('a' + division).toChar.toString;
      val secondletter = ('a' + modulo).toChar.toString;
      firstletter + secondletter;
    }

    val byteRange = (-128 to 127).map(_.toByte);

    val letters = byteRange.map(n => toTwoLetters(n));

    private val byteToLetters = byteRange.zip(letters).toMap;
    require(byteToLetters.size == 256, "size really is: " + byteToLetters.size);

    private val lettersToByte = byteToLetters.map(_.swap);
    require(lettersToByte.size == 256, "size really is: " + lettersToByte.size);

    def bytesToLetters(bytes: Seq[Byte]): String = {
      bytes.map(byte => byteToLetters(byte)).mkString;
    }

    def lettersToBytes(letters: String): Seq[Byte] = {
      letters.sliding(2, 2).map(twoLetters => lettersToByte(twoLetters)).toSeq;
    }

    def encode(str: String, charset: Charset = Codec.UTF8): String = {
      bytesToLetters(str.getBytes(charset));
    }

    def decode(letters: String, charset: Charset = Codec.UTF8): String = {
      new String(lettersToBytes(letters).toArray, charset);
    }
}

因此,假设您有前缀:com.pligor.service
因此有一个非英文名称名称让我们说:Γιώργος
这将被翻译成类似的东西:fmaiefoiafmaiofa
您可以附加它来获得:com.pligor.service.fmaiefoiafmaiofa

在客户端部分收到名称后,您可以提取后缀fmaiefoiafmaiofa并通过对其进行解码,您可以取回原始希腊名称Γιώργος

享受!

于 2013-09-03T12:39:45.190 回答