花了我几个小时来通过谷歌搜索来解决这个问题,我认为需要帮助。我有一个片段导致它不像目标c中的等效片段那样工作,所以需要一些专家的帮助。
以下目标c片段相当于java?
unsigned char mByte[CC_SHA1_DIGEST_LENGTH];
uint64_t tBytes = 0xFFFFFFFF;
答案 0 :(得分:3)
那么没有绝对的等价物,如果所有语言都相同,为什么我们需要不止一个呢?
最接近的可能是:
final int CC_SHA1_DIGEST_LENGTH = 1024; //some length
char[] mByte = new char[CC_SHAR1_DIGEST_LENGTH];
//there is no unsigned keyword in java
//The long data type is a 64-bit two's complement integer
long tBytes = Long.MAX_VALUE;
long tBytes=0xFFFFFFFF;
也可以,但这是一个负数(因为它被视为整数,而不是长整数)。如果您希望它很长,则需要在最后添加L
(0xFFFFFFFFL
)。小心!
有关原始数据类型的更多信息可以在here找到。
答案 1 :(得分:0)
unsigned char mByte [CC_SHA1_DIGEST_LENGTH]; java中的等价物将是
final int CC_SHA1_DIGEST_LENGTH = 1024;
byte mByte [CC_SHA1_DIGEST_LENGTH];
虽然mByte是无符号的,所以当你使用mByte数组时,你必须使用0xFF将字节值转换为无符号。 例如, mByte [0] =(0x88& 0xFF);
uint64_t tBytes = 0xFFFFFFFF; java中的等价物将是
long tBytes = 0xFFFFFFFF;
答案 2 :(得分:0)
那么经验法则是匹配类型长度的比特。
在C中,unsigned char是8位宽,因此Java等效的是 byte 。
在C uint64_t中是64位宽,因此Java等价物将 long 。
因此,Java等价物将是:
//SHA1 lenght would be 20 bytes
public static final int CC_SHA1_DIGEST_LENGTH = 20;
byte mBytes[] = new byte[CC_SHA1_DIGEST_LENGTH];
long tBytes = 0xFFFFFFFF;
@ user3200809
mByte [0] =(0x88& 0xFF); - 除非您的值大于8位,否则此操作毫无意义。
请参阅二进制中的相同操作:
1000 1000
&
1111 1111
=
1000 1000
当分配给mByte [i]时,你必须输入cast to byte,这样所有多余的位都会被切断。
当我们查看这些类型的内存表示时,有符号和无符号类型之间没有区别。
我猜测作者的帖子是他使用SHA1算法,这是一堆二进制操作(xor,and,shift's)。
因此,对于二进制运算,类型有符号或无符号没有区别:
byte b = (byte) 0x80; //-128 in signed decimal
b ^= (byte) 0x01;
System.out.printf("0x%x", b); // prints 0x81 which is -127 in signed decimal
但是如果你正在做的话,你可能会遇到问题。分裂。