创建 Java 实用函数以将无符号字符数组转换为字符串

Posted

技术标签:

【中文标题】创建 Java 实用函数以将无符号字符数组转换为字符串【英文标题】:Create Java Utility Function to Convert Unsigned Char Array to String 【发布时间】:2011-12-20 03:22:13 【问题描述】:

SWIG 将以下无符号字符数组(“id”)转换为 short[]。在 C 端,sender_id_t_ 结构的 id 属性是指向包含字母数字数据的数组的指针,例如“TEST123-E”。我想您可以遍历 short[] (sender_id_t_.getId()) 并将每个元素转换为 char 并连接以构建 Java 字符串。我想知道他们是否是处理这种情况的更好和更简单的方法?

C 头文件:

#define SAMPLE_ID_SIZE_V1 32
#define SAMPLE_ID_SIZE SAMPLE_ID_SIZE_V1

typedef unsigned char sample_id_v1_t[SAMPLE_ID_SIZE];
typedef sample_id_v1_t sample_id_t;

struct sample_sender_id_t_ 
    sample_id_t           id;
    uint32_t              idx;
;
typedef struct sample_sender_id_t_ sample_sender_id_t;

SWIG.i:

%rename (Sample) sender_id_t_;
struct sender_id_t_ 
    unsigned char id_v1_t[32]      id;
    uint32_t   phy_idx;
;

例外:

 [exec] test_wrap.c: In function `TestJNI_Sample_1id_1set':
 [exec] test_wrap.c:826: error: cast specifies array type
 [exec] test_wrap.c:829: error: incompatible types in assignment
 [exec] test_wrap.c:832: error: `jarr2' undeclared (first use in this function)

【问题讨论】:

【参考方案1】:

它被视为short 的数组,因为该类型的unsigned 使得最大值太大而无法放入(有符号的)bytechar。如果您想强制它被视为String,您可以使用%apply 来使用普通的String 类型映射,例如:

%module test

%rename (Sample) sender_id_t_;
%apply char *  unsigned char id[32] ;

struct sender_id_t_ 
    unsigned char id[32];
    uint32_t   phy_idx;
;

(我必须在你的struct 中修正一些语法,这有点奇怪)。

【讨论】:

C 头文件中的结构对我来说有点奇怪(现在包括上面的那个)。对于 sender_id_t_ 结构,我可能没有正确的 SWIG.i 定义。当我按照您的建议尝试 %apply char * 时,出现类型兼容性错误,完整堆栈也在上面。根据我提供的 C 头文件,你知道正确的 SWIG.i 结构吗? @c12 - 使 SWIG 界面中 struct 的内容与头文件匹配 - 该错误是因为 SWIG.i 中的 id 与我怀疑的头文件非常不同。

以上是关于创建 Java 实用函数以将无符号字符数组转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

将无符号字符数组返回到主函数

套接字:将无符号字符数组从 C 传递到 JAVA

怎样用c将无符号整型转化为字符型

如何在C中将无符号字符数组转换为十六进制字符串

如何以优雅有效的方式将无符号/有符号整数/长整数转换为 C 字符串?

如何将无符号字符数组解析为数值数据