【发布时间】:2019-06-17 07:18:31
【问题描述】:
我正在编写一个 hive UDF 来将 EBCDIC 字符转换为十六进制。 Hive 表中存在 Ebcdic 字符。目前我可以转换它,但它在转换时忽略了几个字符。
例子:
这是存储在表中的 EBCDIC 值:
AGNSAñA¦ûÃÃÂõÂjÂq  à ()
转换后的十六进制:
c1c7d5e2000a5cd4f6ef99187d07067203a0200258dd9736009f000000800017112400000000001000084008403c000000000000000080
我想要的输出:
c1c7d5e200010a5cd4f6ef99187d0706720103a0200258dd9736009f000000800017112400000000001000084008403c000000000000000080
忽略以下EBCDIC字符的转换:
01 - 这是航向的开始
10 - 这是一种逃避
15 - 新行。
以下是我目前尝试过的代码:
public class EbcdicToHex extends UDF {
public String evaluate(String edata) throws UnsupportedEncodingException {
byte[] ebcdiResult = getEBCDICRawData(edata);
String hexResult = getHexData(ebcdiResult);
return hexResult;
}
public byte[] getEBCDICRawData (String edata) throws UnsupportedEncodingException {
byte[] result = null;
String ebcdic_encoding = "IBM-037";
result = edata.getBytes(ebcdic_encoding);
return result;
}
public String getHexData(byte[] result){
String output = asHex(result);
return output;
}
public static String asHex(byte[] buf) {
char[] HEX_CHARS = "0123456789abcdef".toCharArray();
char[] chars = new char[2 * buf.length];
for (int i = 0; i < buf.length; ++i) {
chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
}
return new String(chars);
}
}
在转换时,它会忽略几个 EBCDIC 字符。如何让它们也转换为十六进制?
【问题讨论】:
-
你能提供原始数据的十六进制转储吗?在查看提供的内容时,我想从源文件重复操作。您作为文件提供的内容不会为我呈现相同的十六进制值。我正在使用 EBCDIC 编码创建一个新文件并将数据粘贴到其中。我得到的十六进制值为: c1 c7 d5 e2 c1 66 8f c1 62 6a 66 8b 66 66 62 66 62 a0 62 91 62 98 62 62 62 62 40 62 40 66 40 4d 5d 15
标签: java type-conversion user-defined-functions mainframe ebcdic