c++到java从字节数组获取结果

x6492ojm  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(510)

我们有一个用c编写的程序。它接收字节数组并将其转换为值。我有一些c的经验,但经过几天的研究,我意识到这还不够。

quint32 id = getWORD(&rawData[1]);

对我来说 rawData = {0x03, 0xAD, 0x1D, 0xFA, 0x03, 0x02, 0x00, 0x00, 0x00, 0x3D, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00} ```
uint32_t getWORD(const char* buf)
{
uint32_t val;
memcpy(&val, buf, sizeof(val));
return val;
}

如果我正确理解这个方法,就把这个字节转换成uint32\t类型
结果是:

QString result = QString("%1").arg((quint32) id, 8, 16, QChar('0')).toUpper()

我在这里读过关于arg函数的文章,但是有几十个不同的构造函数有不同的参数,而且我在java或kotlin中从未见过类似的东西,所以不知道如何实现它。
如果有任何提示,我将不胜感激
升级版本:

byte[] bytes = {(byte) 0xAD, (byte) 0x1D, (byte) 0xFA, (byte) 0x03};
int result = ByteBuffer.wrap(bytes).getInt(); // = -1390544381

但负值看起来不像设备的正确id
我已经考虑过string.format,但是根据qstring的文档:
qstring qstring::arg(uint a,int fieldwidth=0,int base=10,qchar fillchar=qlatin1char(“”))常量
base参数指定将整数转换为字符串时要使用的基。底座必须介于2和36之间。
如果fillchar为“0”(数字0,ascii 48),则使用区域设置的0。对于负数,减号前可能会出现零填充。
所以我不确定string.format在这种情况下是否有用
cotxawn7

cotxawn71#

在java中,由于所有java整数类型都是有符号的,所以在打印时 int 对于默认格式,它将被解释为负数。但是,用于呈现十六进制数的格式化函数将其视为无符号。
您尚未提供示例输入和输出,但java格式字符串的适当转换字符可能是 X 或者 x ,这取决于字符是大写还是小写。前导空格默认为空格:

public static void main(String[] args) {
    byte[][] inputs = { 
            { (byte) 0xAD, (byte) 0x1D, (byte) 0xFA, (byte) 0x03 },
            { (byte) 0x00, (byte) 0x00, (byte) 0xFA, (byte) 0x03 }};

    for (byte[] bytes : inputs) {

        int result = ByteBuffer.wrap(bytes).getInt(); // = -1390544381
        System.out.println("int:    \"" + String.format("%12d", result) + "\"");
        System.out.println("hex 8:  \"" + String.format("%8X", result) + "\"");
        // equivalent, just to demonstrate positional arguments
        System.out.println(String.format("%2$5s:  \"%1$8X\"", result, "hex 8"));
    }
}

输出:

int:    " -1390544381"
hex 8:  "AD1DFA03"
hex 8:  "AD1DFA03"
int:    "       64003"
hex 8:  "    FA03"
hex 8:  "    FA03"

相关问题