如何在诺基亚 Asha 的 J2ME 中将对象转换为字符串?

Posted

技术标签:

【中文标题】如何在诺基亚 Asha 的 J2ME 中将对象转换为字符串?【英文标题】:How to convert Object to String in J2ME for Nokia Asha? 【发布时间】:2014-07-08 17:57:35 【问题描述】:

我正在为 Nokia Asha 开发并使用 Tantalum 库通过 HTTPPoster 类发出我的 HTTP 请求。

执行任务时,我尝试从其余响应标头中获取 X-Session-Id 标头中的值,这些值作为 HashTable 返回,我需要将此标头中的值转换为 SHA256哈希。

但我无法将从 HashTable 中获得的值转换为字符串。

我的代码如下所示:

final HttpPoster httpPoster = new HttpPoster(Task.FASTLANE_PRIORITY, completeURL);
        httpPoster.setRequestProperty("Content-Type", "application/json");
        httpPoster.setPostData(new byte[]);
        httpPoster.chain(new Task(Task.FASTLANE_PRIORITY)

            protected Object exec(Object in) throws CancellationException,
                    TimeoutException, InterruptedException 
                // TODO Auto-generated method stub
                System.out.println("Task is executing");

                String tmpSessionId = new String(httpPoster.getResponseHeaders().get("X-Session-Id").toString().getBytes());

                byte[] input = null;
                try 
                    input = new String("X-Session-Sig" + tmpSessionId + "test").getBytes("UTF-8");
                 catch (UnsupportedEncodingException e) 
                    // TODO Auto-generated catch block
                    System.out.println("Unsupported encoding exception");
                    e.printStackTrace();
                

                byte[] key = new byte[4];
                int tmpInt = new Random().nextInt();
                key[0] = (byte)(tmpInt >> 24);
                key[1] = (byte)(tmpInt >> 16);
                key[2] = (byte)(tmpInt >> 8);
                key[3] = (byte)(tmpInt);


                Digest digest = new SHA256Digest();
                HMac hmac = new HMac(digest);
                hmac.init(new KeyParameter(key));
                hmac.update(input, 0, input.length);
                byte[] output = new byte[digest.getDigestSize()];
                hmac.doFinal(output, 0);
                sessionId = tmpSessionId;
                sessionSig = new String(Hex.encode(output));
                System.out.println("session id " + sessionId + " session signature " + sessionSig);
                return in;
            
            protected void onCanceled()
                System.out.println("Request was cancelled");
            
        );
        httpPoster.fork();

如您所见,在 String tmpSessionId = new String(httpPoster.getResponseHeaders().get("X-Session-Id").toString().getBytes()); 行中,我尝试转换为字符串,然后获取字节,但这返回 [Ljava.lang.String;@6f7159d,而不是我的实际值正在寻找,即使调用 toString() 方法而不执行 getBytes 方法也返回相同的值。

如何在HashTable中获取该元素的真实值?据我所知,J2ME 不支持 ObjectOutputStream 类。有哪些替代方案?

【问题讨论】:

【参考方案1】:

我发现 [Ljava.lang.String;@6f7159d 部分意味着 HashTable 中的对象是一个字符串数组。

在意识到我只需要转换为 String[] 之后:

String[] stringArray = (String[]) dotREZApi.getCurrentRequest().getResponseHeaders().get("X-Session-Id");
String tmpSessionId = stringArray[0];

这让我得到了我期望的值。

【讨论】:

以上是关于如何在诺基亚 Asha 的 J2ME 中将对象转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

诺基亚 Asha SDK 文件

如何修复诺基亚设备(J2me)中的媒体异常

如何在 j2me 中将 12 小时时间转换为 24 小时时间?

下载大小大于可用流/文件大小。 (阿莎 501,J2ME)

N95 上的 J2ME 位置 API - 需要打开诺基亚地图来预热 GPS?

J2ME“notifyDestroyed()”在诺基亚 501 上无法正常工作