[英]Equivalent in Java
花了我几个小时来通过谷歌搜索来解决这个问题,我认为需要帮助。 我有一个片段,导致它不像目标c中的等效工作,所以需要一些专家的帮助。
java中下面的目标c片段相当于什么?
unsigned char mByte[CC_SHA1_DIGEST_LENGTH];
uint64_t tBytes = 0xFFFFFFFF;
那么没有绝对的等价物,如果所有语言都相同,为什么我们需要不止一个?
最接近的可能是:
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
)。 小心! 有关原始数据类型的更多信息,请参见此处 。
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;
那么经验法则是匹配类型长度的比特。
在C中,unsigned char是8位宽,因此Java等效字节为byte 。
在C uint64_t是64位宽,所以Java等价物将是长的 。
因此,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)。
因此对于二进制操作,类型是有符号或无符号的没有区别:
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
但如果你正在进行分工,你可能会遇到问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.