我在H-Base表的行中有一个限定符(long值类型).
我想在两个长数字之间获取H-Base行.为此,我使用以下过滤器.
我的过滤器就像:
long startEpochInDay = 384;
long endEpochInDays = 396;
string startDayFilter = "SingleColumnValueFilter('" + cf + "','" + qualifier + "', >= ,'binary:" + Encoding.UTF8.GetString(HBaseGenericHelper.GetBigEndianByteArray(startEpochInDays)) + "',true,true)";
string endDayFilter = "SingleColumnValueFilter('" + cf + "','" + qualifier + "', < ,'binary:" + Encoding.UTF8.GetString(HBaseGenericHelper.GetBigEndianByteArray(endEpochInDays)) + "',true,true)";
string finalFilter = startDayFilter + " AND " + endDayFilter
Run Code Online (Sandbox Code Playgroud)
这些过滤器工作正常,数量少于383,但如果数量大于此数字则失败.
我在调试时发现,在将长数转换为字节数组时,它返回字节数组,如\ 0\0\0\0\0\0\1\128.
当字节数组中的最后一个数字是127或更少时,UTF-8工作正常但是当这个数字变为128或更大时,UTF-8开始返回"?" 为最后一位数.
如果我使用以下方法将字节数组编码为字符串
Encoding encoding = new UTF8Encoding(true,true);
string number = encoding.GetString(HBaseGenericHelper.GetBigEndianByteArray(startEpochInDays));
Run Code Online (Sandbox Code Playgroud)
UTF-8在将字节数组(如果最后一位数字在字节数组中为128或更多)转换为过滤器中的字符串时抛出异常.
异常 - 无法将索引6处的字节[8B]从指定的代码页转换为Unicode.
内在例外 -
at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index)
at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index)
at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes)
at System.Text.UTF8Encoding.GetCharCount(Byte* bytes, Int32 count, DecoderNLS baseDecoder)
at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encoding)
at System.Text.UTF8Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)
at System.Text.Encoding.GetString(Byte[] bytes)
Run Code Online (Sandbox Code Playgroud)
提前致谢.
UTF8不是将任意字节编码为字符串的合适方法.相反:它将任意字符串编码为字节(反之亦然,只要字节格式正确).没有理由认为HBaseGenericHelper.GetBigEndianByteArray(startEpochInDays)返回UTF-8数据,因此encoding.GetString完全不合适并且实际上正在使用Encoding 向后.这是我在这里讨论的第一个话题 -所以不必惊慌:你在好公司-人们会犯这种错误的所有时间.
您应该使用的是base-16(十六进制)或base-64.
得到十六进制:BitConverter.ToString(byte[]).获得base-64:Convert.ToBase64String(byte[])
如果您需要的数据采用非base-64或base-16的特定格式,那么您必须具体说明所需的格式.但是:它不是"向后使用UTF-8".
| 归档时间: |
|
| 查看次数: |
399 次 |
| 最近记录: |