SAP导出ASCII格式数据到Azure后十六进制内容转可读文本方案咨询
解答
你遇到的乱码问题核心有两个原因:
- SAP Logon里显示的
FF060201开头的字符串是SAP RAW/RAWSTRING类型字段的十六进制可视化结果,不是纯URL的十六进制编码,开头4个字节(对应十六进制串前8个字符)是SAP内部的字段控制头,不属于有效URL内容,需要先跳过。 - SAP系统默认存储字符串的编码大多是UTF-16LE(非Unicode的老SAP系统用ISO-8859-1),普通ASCII转换工具默认用UTF-8/ASCII编码解码,自然会出现乱码。
不需要引入额外第三方库,用语言原生API即可实现转换:
Python实现
def sap_raw_to_url(hex_str: str, encoding: str = "utf-16le") -> str: # 十六进制串转原始字节数组 raw_bytes = bytes.fromhex(hex_str) # 跳过前4字节SAP控制头 url_bytes = raw_bytes[4:] # 解码并去除末尾空字符 return url_bytes.decode(encoding).strip('\x00')
如果是老的非Unicode SAP系统,把encoding参数改为"latin-1"即可。
Java实现
JDK 17及以上版本
import java.nio.charset.StandardCharsets; import java.util.HexFormat; public class SapDataConverter { public static String convertSapHexToUrl(String hexStr) { byte[] rawData = HexFormat.of().parseHex(hexStr); // 跳过前4字节控制头 byte[] urlData = new byte[rawData.length - 4]; System.arraycopy(rawData, 4, urlData, 0, urlData.length); // 解码后去除空字符 return new String(urlData, StandardCharsets.UTF_16LE).replace("\u0000", ""); } }
JDK 17以下版本
引入Apache Commons Codec依赖后,替换十六进制转换逻辑即可:
import org.apache.commons.codec.binary.Hex; // 其余导入不变 public class SapDataConverter { public static String convertSapHexToUrl(String hexStr) throws Exception { byte[] rawData = Hex.decodeHex(hexStr.toCharArray()); // 后续逻辑和JDK17+版本完全一致 byte[] urlData = new byte[rawData.length - 4]; System.arraycopy(rawData, 4, urlData, 0, urlData.length); return new String(urlData, StandardCharsets.UTF_16LE).replace("\u0000", ""); } }
调试技巧
如果跳过前4字节后还是出现乱码,可以把全量原始字节转成十六进制后,搜索6800740074007000(UTF-16LE编码的http前缀)或者68747470(ASCII编码的http前缀)的偏移位置,从该位置开始解码即可,不用固定跳转4字节。
内容的提问来源于stack exchange,提问作者sdas
相关产品推荐
相关产品推荐

