2013-05-23 3 views
0

Помогите мне что-то понять.Работа с 16-битными символами с помощью sun.misc.Unsafe

Использование .. import sun.misc.Unsafe;

Если мне нужно поставить символ 0-127 в какой-то адрес памяти, для того, чтобы предотвратить из символов диапазона, я это сделать

if (0 != (c & 0xFF80)) { 
    throw new RuntimeException("Only Ascii characters are supported. 0-127."); 
} else { 
    // Since Java's chars are 16 bits long, i cast it 
    // to byte (8 bits) and then `putByte()` 
    UNSAFE.putByte(address, (byte) c); 
} 

Когда мой тест проверяет, что в что память

char c1 = Ascii.a; 
    asciiEncoder.encode(address, c1); 
    assertThat(unsafe.getChar(address), is(c1)); 

Этот тест, кажется, проходит и проваливается на некоторых машинах. Позвольте мне повторить, что это работает на некоторых MAC, а не на других, а на некоторых Windows, а не на других.

Что не удается? Возвращается символ, отличный от 'a'.

Как я понимаю, это возможно, если при распределении память не очищается, но разве это не позаботится об этом?

@Before 
public void setUp() { 
    address = unsafe.allocateMemory(64); // Isn't this mem clean? 
} 

Если я изменить это на 8 бит, тест проходит всегда

@Before 
public void setUp() { 
    address = unsafe.allocateMemory(8); 
} 

Пожалуйста, помогите мне понять

ответ

2

JavaDoc для Unsafe#allocationMemory говорит:

Выделяет новый блок родной памяти, от заданного размера в байтах. содержание памяти неинициализировано; они обычно будут мусором. Получаемый внутренний указатель никогда не будет равен нулю и будет равен для всех типов значений. Утилизируйте эту память, вызвав #freeMemory или изменив ее размер с помощью #reallocateMemory.

Что означает, когда вы положили byte и прочитали char назад, вы получите дополнительный байт мусора.

+0

Он платит RTFM. Спасибо, hoaz! Большое спасибо! – JAM

Смежные вопросы