You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAP导出ASCII格式数据到Azure后十六进制内容转可读文本方案咨询

解答

你遇到的乱码问题核心有两个原因:

  1. SAP Logon里显示的FF060201开头的字符串是SAP RAW/RAWSTRING类型字段的十六进制可视化结果,不是纯URL的十六进制编码,开头4个字节(对应十六进制串前8个字符)是SAP内部的字段控制头,不属于有效URL内容,需要先跳过。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:36:01