[英]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.