繁体   English   中英

相当于Java

[英]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; 也可以,但这是一个负数(因为它被视为一个整数,而不是长整数)。 如果你想要它很长,你需要在最后添加L0xFFFFFFFFL )。 小心! 有关原始数据类型的更多信息,请参见此处

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM