如何将HBase shell中的bytes转换成long ?

有个HBase的小问题:
298066801-00000001-9223370560566775807 column=A:C, timestamp=1476345835226, value=\x00\x00\x01W\xB8wr\xD4

这个value保存的是十六进制,这个值保存的是是时间戳(timestamp),不知道这个应该怎么转换呢?(主要里面有W,以及wr不懂是啥意思)
已邀请:

lhfcws - 喵喵喵?

赞同来自: openinx

贴个python2的版本:
 
如果是long类型:
def tolong(s):
ls = [ord(i) for i in s]
l = len(ls) - 1
sum = 0
for i, v in enumerate(ls): sum += v * (256 ** (l - i))
return sum


print(tolong("\x00\x00\x01W\xB8wr\xD4"))

 
一般是utf8的中文的bytes的话,直接python2 的 print("...") 就可以显示了 。 

smartZY

赞同来自: openinx

HBase shell 中用 HBase提供的Bytes工具类即可
org.apache.hadoop.hbase.util.Bytes.toLong("\x00\x00\x00\x00Yh/\x01".to_java_bytes)
 

hmaster

赞同来自: lhfcws

W,wr没什么特别的含义,就是HBase的Bytes.toStringBinary​()打印出来的而已。
hbase shell 是jruby 实现的,实际上可以直接写Java代码的:

如:
hbase(main):021:0> import java.text.SimpleDateFormat hbase(main):022:0> import java.text.ParsePosition hbase(main):023:0> SimpleDateFormat.new("yy/MM/dd HH:mm:ss").parse("08/08/16 20:56:29", ParsePosition.new(0)).getTime() => 1218920189000


hbase(main):001:0> @shell.hbase.configuration.get("hbase.rpc.timeout")


https://hbase.apache.org/book.html#shell
匿名用户

匿名用户

赞同来自:

背景

使用org.apache.hadoop.hbase.util.Bytes​.toStringBinary​(final byte[])方法,会把byte[]中不可见字符表示成\x00的形式,例如anscii中的
0 ---> \x00
1 ---> \x01 
... 
 
与之相反的另一个方法,org.apache.hadoop.hbase.util.Bytes​.toBytesBinary(String), 会把scan列出的value转化成byte[]序列,例如 
 
\x00abc ---> \0abc .

案例

你通过hbase shell看到的scan的value,就是byte[]通过Bytes.toStringBinary方法变换之后,输出的结果,其实就是可见字符不变,不可见字符统一描述成\xAB的形式.

对应你说的这个问题,通过如下方法就能获得到时间戳:
 
System.out.println(Bytes.toLong(Bytes.toBytesBinary("\\x00\\x00\\x01W\\xB8wr\\xD4")));

 
解析出来,应该是1476268618452

相关代码

代码片段1
package com.xiaomi.java;

import org.apache.hadoop.hbase.util.Bytes;

public class TestBytes {
public static void main(String args[]){
byte[] bytes = Bytes.toBytes("\0abc");

System.out.println(Bytes.toStringBinary(bytes));
System.out.println(Bytes.toStringBinary(Bytes.toBytesBinary("\0abc")));
}
}

 
代码片段2
package com.xiaomi.java;

import org.apache.hadoop.hbase.util.Bytes;

public class TestBytes {
public static void main(String args[]){
System.out.println(Bytes.toLong(Bytes.toBytesBinary("\\x00\\x00\\x01W\\xB8wr\\xD4")));
}
}

isnker - test

赞同来自:

总结下方法:
中文字符
在python中
print "\xE4\xBB\xBB\xE5\x8A\xA1\xE8\xB6\x85\xE6\x97\xB6"

long型数字
在hbase shell中
org.apache.hadoop.hbase.util.Bytes.toLong("\x00\x00\x01^Z\x10\xFB\xB2".to_java_bytes)

int型数字
在hbase shell中
org.apache.hadoop.hbase.util.Bytes.toInt("\x00\x00\x01,".to_java_bytes)
 
原理上面各位讲的很明白了,感谢!

要回复问题请先登录注册