想知道我在这里做错了什么。在Java 1.5上使用Jython 2.2.1和Hbase 0.90。无法让Bytes.toString(byte[] b)工作。它返回看起来像地址的内容。但是当我使用重载的Bytes.toString(byte[] b, int off, int len)时,它会返回正确的结果。
g = Get(Bytes.toBytes(id))
res = self.table.get(g)
t = res.getValue(Bytes.toBytes('stuff'), Bytes.toBytes('t'))
print Bytes.toString(t) // returns stuff like '[B@12121212'
print Bytes.toString(t, 0, len(t)) // returns the string properly
之前有人见过这个吗?
答案 0 :(得分:2)
你没有做错任何事。我在Java 1.8和HBase 1.2.4上运行Jython 2.7并且遇到了完全相同的行为。以下是似乎正在发生的事情:Java支持多个接受不同参数集的相同名称的方法,因此Jython内部必须使用接受不同参数的相同名称消除多个方法之间的歧义。正在转换为字符串的Byte []数组表示为Python数组或其某个子类,它具有接受一个参数(self)的toString()方法。 ' Bytes' object,作为它的子类,同时包含Python array.toString(self)方法和Java .toString(final [] byte b)和.toString(final [] byte b,int off,int len)方法。 / p>
必须是构造Bytes对象的方式导致Python的.toString(self)取代Java的.toString(final [] byte b),但另一种方法仍然有效,因为有没有Python .toString()方法,带有三个参数来取代另一个Java .toString()。 (见https://docs.python.org/2.7/library/array.html?highlight=tostring#array.array.tostring)
解决方案:修改后的导入以及一些额外的代码行修复此问题。
import org.apache.hadoop.hbase.util.Bytes as BrokenBytes
class Bytes(BrokenBytes):
@staticmethod
def toString( x ): return( BrokenBytes.toString( x, 0, len( x ) ) )
答案 1 :(得分:0)
不可能。你所做的事情必须比你发布的更多。 toString的第一个重载调用第二个。这是源代码(来自HBase 0.90.3):
/**
* @param b Presumed UTF-8 encoded byte array.
* @return String made from <code>b</code>
*/
public static String toString(final byte [] b) {
if (b == null) {
return null;
}
return toString(b, 0, b.length);
}
/* snip */
/**
* This method will convert utf8 encoded bytes into a string. If
* an UnsupportedEncodingException occurs, this method will eat it
* and return null instead.
*
* @param b Presumed UTF-8 encoded byte array.
* @param off offset into array
* @param len length of utf-8 sequence
* @return String made from <code>b</code> or null
*/
public static String toString(final byte [] b, int off, int len) {
if (b == null) {
return null;
}
if (len == 0) {
return "";
}
try {
return new String(b, off, len, HConstants.UTF8_ENCODING);
} catch (UnsupportedEncodingException e) {
LOG.error("UTF-8 not supported?", e);
return null;
}
}